标题中缺少内联声明:链接器或编译器错误?

时间:2018-01-21 11:58:54

标签: c++ linker compiler-construction inline

在寻找答案一段时间后,我现在比以前更加困惑......

我想知道我是否在头文件中声明了一个未实现但在main函数中调用的内联函数,这会导致链接器或编译器错误吗?

当我看到错误时,我得到undefined reference to 'A::a()',这似乎是一个链接器错误。

然而,在一些讨论中,它说编译器必须看到函数说明,因此它将是编译器错误。

我希望你能告诉我这里错了:)

部首:
Header

主要功能:
Main function

2 个答案:

答案 0 :(得分:1)

当你有一个functon声明时,大多数编译器都会出现链接器错误,但函数的实现(定义)不存在。

从技术上讲,编译器可能会报告源中没有inline函数,但编译器没有义务这样做,并且代码存在并不总是定义声明为内联的函数。在大多数编译器中,声明函数内联并在单独的编译单元(不同的源文件)中定义它是错误的,因此编译器默认情况下不会给出错误。

如果编译器没有找到内联函数的定义,编译器将假定它是一个外部函数,并且链接器是所有代码汇集在一起​​的唯一位置,因此"它不存在"由链接器发布。

澄清:

您可能会遇到这样的情况:您希望将内联函数声明为内联函数,但是将函数的实现放在源文件中(可能因为它从未在其他任何地方调用过,所以有一个工厂函数可以实例化该类的所有实例)。然后将函数[例如构造函数]声明为头文件中的内联,并将函数的实现放在源文件中,使用不存在实现的各种其他文件中的对象是完全合法的。

实际上,编译器也允许调用内联函数,即使它们仅在源文件中声明,而不是在头文件中声明。编译器并不总是内联这些函数[实际上,只有"链接时间优化"或者"整个计划优化"很可能会这样做。

答案 1 :(得分:-2)

这取决于您使用的编译器,但据我记得,内联声明默认是对编译器的建议。在您的情况下,由于编译器没有找到函数的实现,因此它不会内联实现它,并将它留给链接器进行链接。

如果您正在使用GCC,可以强制编译器进行内联,请参阅此博客中的更多详细信息:

Force inline functions in C++(GCC)