2016-05-13 70 views
8

由于每本书的C++编程语言(Bjarne的Stroustrup的),在第15.2.3(的一个定义规则)页面没有425,我写如下程序:结构与名称相同,但不同的成员在C++

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

我不确定这是否违反*一个定义规则*(ODR)或不。但是,如果是这样,编译器不会被要求提供错误 - 这只是意味着程序员犯了一个错误。 –

+0

@MartinBonner:是的,这显然违反了ODR。你是对的。编译器无需提供错误 – Destructor

+2

请不要插入到商业网站的链接。 –

回答

12

One Definition Rule说:

如果一个.cpp文件定义struct S { int x; };和其他的.cpp 文件定义struct S { int y; };,即 联系在一起是不确定程序的行为。

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

如果你想知道背后的原因,然后阅读this

希望它有帮助。 :)

相关问题