根据书 C ++编程语言(Bjarne Stroustrup),在第15.2.3节(一个定义规则)第425页,我编写如下程序:
file1.cpp
struct S2 { int a; char b; };
file2.cpp
struct S2 { int a; char bb; };
int main(){ return 0;}
编译我试过下面的命令。
g++ -std=c++11 file1.cpp file2.cpp
和
clang++ -std=c++11 file1.cpp file2.cpp
这两个命令都会生成可执行文件而不会出现任何错误或警告。但是按照书中这个例子应该给出错误。
答案 0 :(得分:12)
如果一个.cpp文件定义
struct S { int x; };
而另一个.cpp file定义struct S { int y; };
,即程序的行为 将它们链接在一起未定义。
因此,您的程序调用未定义的行为(UB)。因此,编译器不需要为此进行诊断。
如果您想了解其背后的原因,请阅读this。
希望它有所帮助。 :)