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