如何使 LD 将乘法定义的结构/类视为错误
how to make ld treat Multiply defined structs/classes as an error?
>编辑 - 澄清我的问题的目标:我浪费了很多时间来诊断我希望链接器报告的问题,这些问题是由公认的糟糕的编程风格引起的,例如,当将代码块从一个编译单元复制粘贴到另一个编译单元并更改它时,就会弹出。
我正在寻找一种在编译/链接时检测此问题的方法。
在此设置中:
啊
void foo();
答.cpp
struct A {
int values[100];
A(){
std::cout << __FILE__ << ": A::A()n";
}};
void foo(){
A a;
}
主.cpp
#include "A.h"
struct A {
double values[100];
A(){
std::cout << __FILE__ << ": A::A()n";
}};
int main(){ foo(); }
// void foo(){} ===> this would cause a linker error
我希望链接器报告结构A
,或者至少构造函数A::A()
,被定义两次。
但是,g++ 4.4 链接很好。 运行代码表明,在这种情况下,链接器选择使用 A.cpp 中的A
。
$ g++ -Wall A.cpp main.cpp && ./a.out
A.cpp:3
A.cpp:7
A.cpp:3
当函数foo()
存在于两个对象文件中时,链接器会报告多个定义,但对于结构,它不会。
编辑:刚刚通过使用nm -C *.o
发现,A.o和main.o都A::A()
定义为弱符号。 这导致它可以从具有相同名称的符号池中"选择"。 也许这个问题可以改写为"如何使编译器生成强符号?...
00000000 W A::A()
如何检测此问题?
也许这个问题可以改写为"如何使编译器生成强符号?...
尝试限制inline
函数的使用:
struct A {
A();
};
// Inside A.cpp
A::A() {
std::cout << __FILE__ << ": A::A()n";
}
对于未声明为inline
函数(包括隐式声明inline
的函数,如类定义中定义的成员(,实现更有可能报告ODR违规,尽管严格来说,这种诊断从来都不需要。
这不是问题,也不是重新定义。这就是C++的工作方式。想想看——你把类定义放在头中(只公开声明要少得多(。标题几乎被复制粘贴到使用它们的每个翻译单元中。在多个 TU 中对同一类有多个定义不会是错误。所以,这不是要解决的问题。
但是,编译器/链接器应该抱怨是否在同一名称下定义了不同的类。
相关文章:
- C++ 结构错误"调用'erase'没有匹配函数
- 尝试传递结构数组,但出现"无法将'结构'转换为'结构*'错误
- 结构错误:"no matching function for call to "
- UE4 数据表结构错误
- STL 对priority_queue<int、结构>错误
- C :用于体系结构错误的经典未定义符号
- 体系结构错误的未定义符号
- 奇怪的用户定义的比较结构错误,用于C++中的priority_queue
- 模板结构错误
- C++结构错误 - 错误 C2061:语法错误:标识符
- C++ 结构错误的前向声明
- 结构错误"uninitialized reference member"
- 使用 MPL::fold 与占位符和我自己的结构错误
- C++结构错误"No matching function for call..."
- 插入映射<字符串,结构>错误
- CPP 头文件结构错误
- 矢量和结构错误
- C++ 结构 - 错误 1 错误 C2143:语法错误:缺少'*'之前的';'
- 结构错误的构造函数(调用类的构造函数 denconstructor,用于填充结构)
- 结构错误与C++