2016-05-13 31 views
8

Zgodnie książki C++ Programming Language (Bjarne Stroustrup), w punkcie 15.2.3 (zasada One Definition) strona nr 425, piszę program, jak poniżej:struct z tej samej nazwie, ale innym członka w C++

file1.cpp

struct S2 { int a; char b; }; 

file2.cpp

struct S2 { int a; char bb; }; 
int main(){ return 0;} 

Aby skompilować próbowałem poniżej polecenia.

g++ -std=c++11 file1.cpp file2.cpp 

i

clang++ -std=c++11 file1.cpp file2.cpp 

Oba te polecenia wytwarzania wykonywalny bez żadnych błędów lub ostrzeżenia. Ale jak na książkę ten przykład powinien dać błąd.

+0

Nie jestem pewien, czy jest to naruszenie zasady * one definition * (ODR), czy nie. Jeśli jednak tak jest, kompilator nie musi podawać błędu - oznacza to tylko, że programista popełnił błąd. –

+0

@MartinBonner: tak, jest to wyraźne naruszenie ODR. masz rację. Kompilator nie musi podawać błędu. – Destructor

+2

Nie wstawiaj linków do witryn komercyjnych. –

Odpowiedz

12

One Definition Rule mówi, że:

jeśli jeden plik .cpp definiuje struct S { int x; }; a drugi plik .cpp definiuje struct S { int y; };, zachowanie programu, który łączy je razem jest niezdefiniowany.

Twój program wywołuje niezdefiniowane zachowanie (UB). Tak więc kompilator nie musi podawać diagnozy.

Jeśli chcesz poznać jego przyczynę, przeczytaj this.

Mam nadzieję, że to pomaga. :)