假设我的头文件myheader.h
定义如下:
#ifndef MY_HEADER
#define MY_HEADER
int MyFunction(int x)
{
return x + 1;
}
#endif
然后,我有两个源文件,这两个#include
这个头文件。这给了我一个编译错误:
multiple definitions of 'MyFunction(int)'
为什么我的头文件中的include guard不能防止它被定义两次?
答案 0 :(得分:3)
您需要标记您的函数inline
,如下所示:
#ifndef MY_HEADER
#define MY_HEADER
inline int MyFunction(int x)
{
return x + 1;
}
#endif
<强>解释强>:
每次在任何.cpp文件中包含.h时,最终都会得到函数的定义。链接器不喜欢多个定义。但是,如果您标记函数inline
,则告诉编译器确保链接器满意。
如何使链接器满意的真正方法取决于编译器和链接器,但在实践中,它归结为两种策略:
答案 1 :(得分:1)
链接器将为每个包含标头的编译单元传递一个定义。
链接器总是需要1个定义。
考虑在一个源文件中定义函数,或者使用inline
指令。
答案 2 :(得分:1)
声明(.h)与定义(.c,.cpp ...)
不同一个好的做法是在一个头文件中声明一个函数,在guard中:
//file foo.h: can be included in other header or implementation files
#ifndef MY_HEADER
#define MY_HEADER
int MyFunction(int x);
#endif
并在实现文件中定义一个函数:
//file foo.c: not included in other files.
#include "foo.h" // to assert function declaration and definition match
int MyFunction(int x)
{
return x+1;
}