使用内联链接在冲突定义上生成错误

jme*_*lfe 7 c++ linker inline

今天我偶然发现了一个好奇的虫子,到目前为止我已经设法避开了.

file1.cpp:

#include <iostream>
inline void print() { std::cout << "Print1\n"; }
void y() { print(); }
Run Code Online (Sandbox Code Playgroud)

file2.cpp:

#include <iostream>
inline void print() { std::cout << "Print2\n"; }
void x() { print(); }
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

int x();
int y();

int main(){
    x();
    y();
}
Run Code Online (Sandbox Code Playgroud)

输出:

Print1                         (Expected Print2)
Print1
Run Code Online (Sandbox Code Playgroud)

因为print()具有内联链接,所以不会产生多重定义错误(使用编译g++ -Wall file1.cpp file2.cpp main.cpp),并且重复符号会以静默方式折叠.我看到的实际情况是使用内联类方法,而不是显式内联函数,但效果是相同的.

我想知道是否有一个链接器选项或类似的东西,这将允许我在出现这种类型的错误时产生警告?

And*_*ite 0

我将无耻地从我在这里找到的类似主题的电子邮件线程中复制粘贴......

这不是海湾合作委员会的问题。

您没有提到您正在使用哪个操作系统。我假设它是 GNU/Linux。在 GNU/Linux 或任何其他基于 ELF 的系统上,有一个全局变量和函数的全局命名空间。当两个共享库使用相同的全局变量名时,它们引用相同的变量。这是一个特点。

如果您希望发生不同的情况,请查看符号可见性和链接器版本脚本。

看起来你应该能够告诉链接器/编译器符号 X 应该是唯一的,如果不是,则抱怨。