C++ 中的内联函数
Posted
技术标签:
【中文标题】C++ 中的内联函数【英文标题】:Inline functions in C++ 【发布时间】:2010-08-22 09:31:54 【问题描述】:嗨,
我是 C++ 的新手。我确实阅读了内联函数并正确理解了它们。但是this 网站说“如果我们在一个 .cpp 文件中编写内联函数的定义并从另一个文件中调用它,我们会得到一个'未解决的外部'错误......为什么会这样......? 这可以为正常功能完成...如果我错了请纠正我...
谢谢
【问题讨论】:
您的意思是在另一个 .cpp 文件中#include 一个 .cpp 文件吗?这很奇怪。 因为它是inline
。其他人可以进一步解释。
【参考方案1】:
这是语言要求。 inline
表示您可能在多个翻译单元中定义了该功能,但定义必须相同,并且您必须在使用的每个翻译单元中都有定义函数。
这些是规则。规则允许(但不要求)编译器在每个调用点扩展 inline
函数的代码并省略发出可调用函数版本。
这与非inline
函数不同,非inline
函数只能在所有翻译单元中定义一次。这是适用于 C++ 中大多数实体的常见“单一定义规则”。
inline
不会改变函数的链接。 inline
函数默认具有外部链接,因此如果您在 inline
函数中使用 static
变量,则实现必须确保程序中只有该变量的一个副本。
【讨论】:
如果您在多个 cpp 文件中需要它们,最好将它们放在头文件中而不是多次实现它们。【参考方案2】:请记住,编译器在逐个文件的基础上运行,即它将每个 .cpp 文件视为其自己的离散单元。它们之间没有任何联系(当然除了对链接器粘合在一起的其他函数和变量的引用)。
如果你内联了一些东西,并且编译器决定按字面意思理解你(记住,内联是一个提示,这意味着编译器可以选择忽略你),它会将函数嵌入到任何其他块的代码中正在调用它,所以不会有链接器可以将其他.cpp文件指向两个的函数。
举个例子:
文件 a.cpp:
void func1()
// code...
这将创建一个目标文件(如 a.obj),其中包含 func1 的代码,其他人可以调用它。链接器将能够告诉其他 .cpp 文件到那里。
文件 b.cpp:
void func2()
func1();
这将创建 b.obj,其中包含 func2 和对 func1 的函数调用。代码不知道 func1 做了什么,它只是在这里有一个分支,并要求链接器在所有内容编译完成后放入正确的地址。
这一切都很好,但如果 a.cpp 仅具有 func1 的内联版本,则链接器将无法提供 func2() 。
【讨论】:
inline
关键字和函数内联是有区别的。 (通常,它们甚至不相关。)以上是关于C++ 中的内联函数的主要内容,如果未能解决你的问题,请参考以下文章