C ++中的内联函数

时间:2010-08-22 09:31:55

标签: c++

Hii,

我是C ++的新手。我确实阅读过有关内联函数的内容并正确理解它们。但是this网站说“如果我们在一个.cpp文件中编写内联函数的定义并从另一个文件中调用它,我们会得到'未解决的外部'错误....为什么会这样......? 这可以用于正常的功能吧...如果我错了,请纠正我......

由于

2 个答案:

答案 0 :(得分:11)

这是语言要求。 inline表示您可能在多个翻译单元中定义了该功能,但定义必须相同,且必须在每个翻译单元中都有定义使用该功能。

这些是规则。规则允许(但不要求)编译器在每个调用站点扩展inline函数的代码,并省略发出可调用函数版本。

这与非inline函数不同,非inline函数只能在所有翻译单元中定义一次。这是通常的“一个定义规则”,适用于C ++中的大多数实体。

inline不会更改函数的链接。默认情况下,static函数具有外部链接,因此如果在inline函数中使用{{1}}变量,则实现必须确保程序中只有该变量的一个副本。 / p>

答案 1 :(得分: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()。