具有全局功能的hpp / cpp拆分:.的多重定义.错误
hpp/cpp split with global function: Multiple definition of ... error
编辑:问题是被遗忘的包含保护。不好意思!
因此,我正在尝试应用两个文件规则,其中所有声明都进入 .hpp 文件,所有定义进入相应的.cpp文件。我的问题是库中的全局函数,其标头包含在多个位置。
例如:
/* lib1.hpp */
namespace lib1{
int addNumbers(int a, int b);
}
和 cpp 文件:
/* lib1.cpp */
namespace lib1{
int addNumbers(int a, int b) {return a + b;}
}
现在,如果我在多个库中包含lib1.hpp,例如lib2,lib3,然后在任何其他库或可执行文件中包含lib2和lib3,
我收到addNumbers()错误的多个定义。
这对我来说是有道理的,但我无法弄清楚如何解决这个问题。我尝试了extern
关键字,但它没有改变任何东西:
/* lib1.hpp */
namespace lib1{
extern int addNumbers(int a, int b);
}
并且 cpp 文件保持不变:
/* lib1.cpp */
#include "lib1.hpp"
namespace lib1{
int addNumbers(int a, int b) {return a + b;}
}
如果我为 lib1.hpp 中的函数创建一个环绕类,它会起作用,但这无助于我理解问题并添加一个冗余命名空间,例如 lib1::lib1::addNumbers()
。
1.) 如果您的函数应该在头文件中定义,请添加内联关键字。
2.) 我认为以两个下划线开头的名称是为编译器保留的。
正如"Let Us Embed"所告诉使用预处理器指令以避免重复声明。
# pragma once ///if the compiler supports
对于其他编译器,请使用:
#ifndef EXAMPLE
#define EXAMPLE
Add your code
#endif
尝试在 .hpp 文件中使用 #define
,如下所示
/* lib1.hpp */
#ifndef __LIB_1__
#define __LIB_1__
namespace lib1{
int addNumbers(int a, int b);
}
#endif /*__LIB_1__*/
相关文章:
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用命名空间时出现多个定义错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 在运算符重载定义中使用成员函数(const错误)
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 已定义函数时出现 G++ "未定义的引用"错误
- C++ G++ 编译器 - 错误:隐式声明的定义
- 链接 cmake 时出现未定义的引用错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接阶段出现多重定义错误
- 已经以性格错误定义了
- vim ctag导致了对乐趣的错误定义
- C++ 隐式声明的编译器错误定义
- 编译器错误-定义问题.C++