编辑:问题是被遗忘的包括警卫。遗憾!
因此,我尝试应用两个文件规则,其中所有声明都进入 .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()
例如。
答案 0 :(得分:1)
As"让我们嵌入"已经告诉使用预处理器指令来避免重复声明。
# pragma once ///if the compiler supports
其他编译器使用:
#ifndef EXAMPLE
#define EXAMPLE
Add your code
#endif
答案 1 :(得分:0)
尝试在 .hpp 文件中使用#define
,如下所示
/* lib1.hpp */
#ifndef __LIB_1__
#define __LIB_1__
namespace lib1{
int addNumbers(int a, int b);
}
#endif /*__LIB_1__*/
答案 2 :(得分:0)
1。)如果您的函数应在头文件中定义,请添加内联关键字。
2.)我认为以两个下划线开头的名称是为编译器保留的。