我在 Stroustrup 的书中读到这一行: “内联函数(第 7.1.1 节,第 10.2.9 节)必须通过相同的定义(第 9.2.3 节)在使用它的每个翻译单元中进行定义。”
“需要在所有翻译单元中定义内联函数”背后的基本原理是什么?我理解错了吗?我知道除了一个(包含定义)之外的所有翻译单元中的其他函数声明都可以。
从历史上看,C++ 语言编译器是建立在独立翻译原则之上的。每个翻译单元都是完全独立编译的(只有链接器才能看到整个程序)。
在这种情况下,为了执行内联,编译器必须能够在每个调用它的翻译单元中看到函数的源代码。为此,必须在每个翻译单元中定义(即用正文声明)。
一个内联函数可以在多个翻译单元中多次定义,因此如果在一个未定义的翻译单元中使用它,链接器将不知道要使用哪个定义。(这显然可以解决,但它会导致链接器额外的复杂性,并且不会有任何明显的优势。)
它可以防止用户错误。如果您打算编写一个inline
函数,但编译器会默默地忽略您,因为您仍然将定义放在 .cpp 文件中,那么您将很难发现错误。该程序仍将运行,但速度较慢。