假设我有一个头文件myheader.h
定义如下:
#ifndef MY_HEADER
#define MY_HEADER
int MyFunction(int x)
{
return x + 1;
}
#endif
然后,我有两个源文件,它们都是 #include
这个头文件。这给了我一个编译错误:
multiple definitions of 'MyFunction(int)'
为什么我的头文件中的包含保护不能阻止它被定义两次?
最佳答案
您需要将您的函数标记为内联
,如下所示:
#ifndef MY_HEADER
#define MY_HEADER
inline int MyFunction(int x)
{
return x + 1;
}
#endif
说明:
每次将 .h 包含在任何 .cpp 文件中时,最终都会得到该函数的定义。链接器不喜欢多个定义。但是,如果您标记函数inline
,您就是在告诉编译器确保链接器得到满足。
如何让链接器满意的真正方法取决于编译器和链接器,但在实践中,它可以归结为两种策略:
- 内联函数 - 这意味着函数定义实际上已从生成的代码中删除。相反,无论该函数应该做什么,都将在调用该函数的地方完成。
- 将函数标记为本地名称 - 链接器知道本地名称特定于特定文件,并且始终将它们分开。
关于c++ - 一个函数的多个定义,即使是在包含保护内部定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35557382/