6

在带有保护的头文件中定义的非内联函数

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

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

4

3 回答 3

11

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

于 2009-07-02T11:09:25.400 回答
8

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

于 2009-07-02T11:13:15.127 回答
4

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

于 2009-07-02T11:07:57.447 回答