C++ 同一类的若干定义
在使用MSVC++2005时,我注意到,如果多次定义同一个类,程序仍然可以愉快地链接,即使是在最高警告级别。我觉得很奇怪,为什么这不是一个错误 模块a.cpp:C++ 同一类的若干定义,c++,linker,C++,Linker,在使用MSVC++2005时,我注意到,如果多次定义同一个类,程序仍然可以愉快地链接,即使是在最高警告级别。我觉得很奇怪,为什么这不是一个错误 模块a.cpp: #include <iostream> struct Foo { const char * Bar() { return "MODULE_A"; } }; void TestA() { std::cout << "TestA: " << Foo().Bar() << std::endl
#include <iostream>
struct Foo {
const char * Bar() { return "MODULE_A"; }
};
void TestA() { std::cout << "TestA: " << Foo().Bar() << std::endl; }
输出为:
TestA: MODULE_A
TestB: MODULE_A
是一个错误——代码打破C++一条定义规则。如果你这样做,标准说你会有未定义的行为
代码链接,因为如果您有:struct Foo {
const char * Bar() { return "MODULE_B"; }
};
在这两个模块中都不会出现ODR冲突——毕竟,这基本上就是包含头所做的。违反是因为您的定义不同(另一个包含字符串“MetrieA”),但是链接器(只看类/函数名)无法检测到这一点。这样,链接器将永远看不到这两个类的存在!不过,这只是一个想法 或者,TestA和类Foo[#]之间的链接可以在编译内部完成。如果链接器正在查找类Foo(多个定义),则会发生冲突,但链接器根本不查找它
如果在未启用优化的调试模式下编译,是否存在链接错误?它不是内联。如果是,输出将是正确的。编译器可能正在丢弃一个(随机选择的)符号。正如尼尔所指出的,如果它们都是一样的,那就完全可以了。
TestA: MODULE_A
TestB: MODULE_A
struct Foo {
const char * Bar() { return "MODULE_B"; }
};