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

C++ 在两个单独的cpp文件中定义的内联函数能否在链接期间创建重复符号?,c++,compiler-construction,inline,compiler-optimization,tail-recursion,C++,Compiler Construction,Inline,Compiler Optimization,Tail Recursion,我发现许多在线资源都在喋喋不休地谈论内联(甚至\uuuu属性((总是内联))或\uu强制内联)如何不强制编译器(例如gcc或VisualC++)内联函数。但什么时候才能不强制执行呢?有玩具的例子吗 也许不一定是同一个问题,在链接过程中,两个不同的cpp文件中包含的带有inline标记的函数何时会产生问题?即,生成重复符号 下面是一个具体的沙盒,用于尝试破坏编译器内联并生成重复符号: 在myinline.h中: inline int myinline() { // code that cann

我发现许多在线资源都在喋喋不休地谈论
内联
(甚至
\uuuu属性((总是内联))
\uu强制内联
)如何不强制编译器(例如gcc或VisualC++)内联函数。但什么时候才能不强制执行呢?有玩具的例子吗

也许不一定是同一个问题,在链接过程中,两个不同的cpp文件中包含的带有
inline
标记的函数何时会产生问题?即,生成重复符号

下面是一个具体的沙盒,用于尝试破坏编译器内联并生成重复符号:

myinline.h
中:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}
在辅助cpp的

#include "myinline.h"
int aux()
{
  return my_inline();
}
#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}
main.cpp
中:

#include "myinline.h"
int aux()
{
  return my_inline();
}
#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;
这样,编译器必须生成函数的定义,以便能够给它一个地址。但即使在每个翻译单元中都这样做,也不会出现链接器错误,因为这将在链接时消除重复数据。所有定义都相同的要求确保了定义的正确性。

“内联”和“重复符号”是不同的东西。
inline
关键字明确允许多个定义(即,它免除了您的一个定义规则),因此平台(编译器和链接器)必须知道如何处理和消除重复

(对于在头文件中定义的类成员函数,这种情况一直发生。)

如果您只想生成代码,可以将函数的地址存储在某个位置:

auto fp = my_inline;

这样,编译器必须生成函数的定义,以便能够给它一个地址。但即使在每个翻译单元中都这样做,也不会出现链接器错误,因为这将在链接时消除重复数据。所有定义都相同的要求确保了定义良好。

现代编译器能够很好地处理这一问题。旧编译器经常用这种方法来阻塞(Borland C++ 4.5,5我在看你!):现代编译器处理这个问题。旧的编译器经常使用这种方法(Borland C++ 4.5,5我在看你!):这意味着如果我写代码<内联< /代码>我将永远不会得到一个重复的符号这样?@ Mangelorf:如果“复制符号”你是指“ODR违规”,那么是的。这是否意味着如果我以这种方式写
内联
我将永远不会得到重复的符号?@mangledorf:如果“重复符号”的意思是“ODR违规”,那么是的。