如果函数是static inline
,则此处的inline
仅起建议作用。对于static
或static inline
,函数具有内部链接,编译器知道该函数不能在翻译单元之外调用。因此,在编译器优化的情况下,可能不会为此函数发出任何符号。
在具有外部链接的内联函数的情况下,7.1.2.4中的C++标准文档规定,
应在每个翻译单元中定义一个内联函数,其中它是odr使用的,在每个案例如果函数的定义出现在翻译单元中在第一次声明为内联之前,该程序的格式不正确。如果具有外部链接的函数在一个翻译中被内联声明单位,应在其所在的所有翻译单位中内联声明出现;不需要进行诊断。具有外部的内联函数链接在所有翻译单元中应具有相同的地址。。。
这与C不同;具有外部链接并被引用,外部定义必须出现在另一个翻译单元中;内联定义和外部定义是不同的并且可以用于调用(6.7.4.8(";。
另一方面,C++程序中的内联函数必须在每个翻译单元中内联,并且具有相同的定义。当编译器看到一个extern inline
函数时,它知道当这个函数在另一个翻译单元中被调用时,在同一翻译单元中会提供一个相同的定义,因此编译器可以";内联";它没有符号输出。
因此,据我所知,在C++的情况下,优化后的static inline
和extern inline
的目标代码输出应该没有差异。这是正确的吗?
这里的重要区别是,在各个翻译单元中具有内部链接的函数是不同的函数,而在各个翻译单位中具有外部链接的内联函数定义都定义了相同的发出(例如,因为存储了指向函数的指针(,外部链接会使其成为弱符号,而不是本地符号。
然而,更显著的区别是,如果在头文件中定义了"a"static inline
函数f
,则可能会出现ODR违规:任何使用f
的多重定义实体(,例如,头文件中多次包含的函数模板(都是无效的,因为每个定义都使用不同的f
。