我发现许多在线资源都在谈论
inline
(甚至 __attribute__((always_inline))
或 __forceinline
)如何不强制编译器(例如 gcc 或 VisualC++)内联函数。但具体什么时候 inline 不会被强制执行呢?有玩具示例吗?
也许不一定是同一个问题,两个不同的cpp文件中包含有
inline
标记的函数什么时候会在链接过程中产生问题?即生成重复符号?
这是一个具体的沙箱,用于尝试破坏编译器内联并生成重复符号:
在
myinline.h
:
inline int myinline()
{
// code that cannot be inlined...
...
}
在
aux.cpp
:
#include "myinline.h"
int aux()
{
return my_inline();
}
在
main.cpp
:
#include "myinline.h"
int aux();
int main()
{
return aux() + my_inline();
}
然后,例如在 gcc 的情况下,是否有一些
myinline
的(最小)代码在编译和链接时会导致重复符号:
g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o
?
“内联”和“重复符号”是不同的东西。
inline
关键字明确允许多个定义(即它使您免受单一定义规则的约束),因此平台(编译器和链接器)必须知道如何处理和消除重复。
(对于标头中定义的类成员函数,这种情况经常发生。)
如果您只想发生代码生成,您可以将函数的地址存储在某处:
auto fp = my_inline;
这样编译器必须生成函数的定义,以便能够给它一个地址。但即使您在每个翻译单元中都执行此操作,您也不会收到链接器错误,因为这将在链接时进行重复数据删除。所有定义都相同的要求确保了定义明确。