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

6

使用宏定义保护的头文件中定义了非内联函数

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

在链接器错误中:在某个.obj文件中已经定义 将函数设置为内联可以正常工作,但我无法理解为什么该函数在第一种情况下就出现了错误。

3个回答

12
如果头文件被包含在多个源文件中,并且该函数未标记为“inline”,则会有多个定义。包含保护仅防止在同一源文件中多次包含。

1
我还要强调的是,在谈论在类声明中定义的类方法时,“内联”关键字并不是必需的。https://dev59.com/u3VC5IYBdhLWcg3w7Vtq#145952 - Antonio

8
你正在违反唯一定义规则。如果你想直接在头文件中定义一个函数,你必须将其标记为inline——这将允许该函数被多次定义。另外请注意,inline没有其他含义,特别是它不会强制编译器内联调用(与普遍的看法相反)。

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接