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