Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同一类的若干定义_C++_Linker - Fatal编程技术网

C++ 同一类的若干定义

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

在使用MSVC++2005时,我注意到,如果多次定义同一个类,程序仍然可以愉快地链接,即使是在最高警告级别。我觉得很奇怪,为什么这不是一个错误

模块a.cpp:

#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"; }
};