具有相同名称但在C ++中具有不同成员的结构

时间:2016-05-13 07:09:15

标签: c++ c++11 undefined-behavior one-definition-rule

根据书 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

这两个命令都会生成可执行文件而不会出现任何错误或警告。但是按照书中这个例子应该给出错误。

1 个答案:

答案 0 :(得分:12)

One Definition Rule说:

  

如果一个.cpp文件定义struct S { int x; };而另一个.cpp   file定义struct S { int y; };,即程序的行为   将它们链接在一起未定义

因此,您的程序调用未定义的行为(UB)。因此,编译器不需要为此进行诊断。

如果您想了解其背后的原因,请阅读this

希望它有所帮助。 :)