2016-05-13 96 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

希望它有幫助。 :)

相關問題