gpt4 book ai didi

c++ - 在两个单独的 cpp 文件中定义的内联函数是否可以在链接期间创建重复的符号?

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:54 24 4
gpt4 key购买 nike

我发现很多在线资源都在喋喋不休地谈论 inline(甚至 __attribute__((always_inline))__forceinline)如何不强制编译器(例如 gcc 或 VisualC++)内联函数。但究竟什么时候内联不被强制执行?有玩具示例吗?

也许不一定是同一个问题,什么时候包含在两个不同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;

这样编译器必须生成函数的定义,以便能够给它一个地址。但即使你在每个翻译单元中都这样做,你也不会得到链接器错误,因为这将在链接时被删除。所有定义都相同的要求可确保这是明确定义的。

关于c++ - 在两个单独的 cpp 文件中定义的内联函数是否可以在链接期间创建重复的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19843380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com