即使在包含保护内部定义的功能的多个定义

时间:2016-02-22 15:21:02

标签: c++

假设我的头文件myheader.h定义如下:

#ifndef MY_HEADER
#define MY_HEADER

int MyFunction(int x)
{
    return x + 1;
}

#endif

然后,我有两个源文件,这两个#include这个头文件。这给了我一个编译错误:

multiple definitions of 'MyFunction(int)'

为什么我的头文件中的include guard不能防止它被定义两次?

3 个答案:

答案 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;
}