带有警卫的头文件中定义的非内联函数
#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H
void foo()
{
//something
}
#endif
链接器错误的结果:已在someother.obj文件中定义 使函数内联工作正常,但我无法理解为什么函数在第一种情况下已经错误。
答案 0 :(得分:9)
如果标题包含在多个源文件中,并且该函数未标记为“内联”,则您将拥有多个定义。包含保护仅防止同一源文件中的多个包含。
答案 1 :(得分:7)
您违反了the one definition rule。如果要直接在标题中定义函数,则必须将其标记为inline
- 这将允许多次定义函数。另请注意,inline
没有其他含义,特别是它不会强制编译器内联调用(与普遍看法相反)。
答案 2 :(得分:4)
由于它不是内联的,因此每个翻译单元都有自己的函数副本,导致函数被多次定义。