链接器在头文件中定义非内联函数时出错?

时间:2009-07-02 11:06:10

标签: c++ function header definition

带有警卫的头文件中定义的非内联函数

#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H 
void foo()
{
//something
}
#endif

链接器错误的结果:已在someother.obj文件中定义 使函数内联工作正常,但我无法理解为什么函数在第一种情况下已经错误。

3 个答案:

答案 0 :(得分:9)

如果标题包含在多个源文件中,并且该函数未标记为“内联”,则您将拥有多个定义。包含保护仅防止同一源文件中的多个包含。

答案 1 :(得分:7)

您违反了the one definition rule。如果要直接在标题中定义函数,则必须将其标记为inline - 这将允许多次定义函数。另请注意,inline没有其他含义,特别是它不会强制编译器内联调用(与普遍看法相反)。

答案 2 :(得分:4)

由于它不是内联的,因此每个翻译单元都有自己的函数副本,导致函数被多次定义。