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++ 中的内联函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的内联函数

lambda 是不是像 C++ 中的函数一样内联?

C++基础--inline

C++ 为啥要引入内联函数、、

何时可以/将在 C++ 中内联函数?可以强制内联行为吗?

c++中内联函数的零成本列表