我在网上发现了许多有关如何的资源 inline (乃至 __attribute__((always_inline)) 或者 __forceinline)不会强制编译器(例如GCC或Visualc ++)内联函数。但是何时无法执行内联?有玩具例子吗?

也许不一定是同一问题,何时将标记一个功能 inline 包含在两个不同的CPP文件中会在链接期间产生问题?即,生成重复的符号?

这是一个混凝土沙盒,用于试图打破编译器内部并生成重复的符号:

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;

这样,编译器必须生成函数的定义,以便能够给它一个地址。但是,即使您在每个翻译单元中执行此操作,也不会收到链接器错误,因为这将在链接时间进行重复。所有定义都是相同的要求,请确保这是明确定义的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top