hpp / cpp与全局函数分割:错误的多重定义

时间:2016-03-14 09:22:00

标签: c++ c++11 linker prototype header-files

编辑:问题是被遗忘的包括警卫。遗憾!

因此,我尝试应用两个文件规则,其中所有声明都进入 .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()例如。

3 个答案:

答案 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.)我认为以两个下划线开头的名称是为编译器保留的。