2016-05-13 14 views
8

di cui al Libro Il C++ Programming Language (Bjarne Stroustrup), nella sezione 15.2.3 (La regola Una definizione) pagina no 425, scrivo programma come di seguito:struct con lo stesso nome ma diversi Stati in C++

file1.cpp

struct S2 { int a; char b; }; 

file2.cpp

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

Per compilare ho provato sotto comando.

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

e

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

Entrambi questi comandi produrre eseguibili con qualsiasi errore o avviso. Ma come da libro questo esempio dovrebbe dare errore.

+0

Non sono sicuro se si tratta di una violazione della * regola di definizione * (ODR) o meno. Tuttavia, se lo è, il compilatore * non * è richiesto per dare un errore - significa semplicemente che il programmatore ha commesso un errore. –

+0

@ MartinBonner: sì, questa è una chiara violazione dell'ODR. hai ragione. Compilatore non è tenuto a dare un errore – Destructor

+2

Si prega di non inserire collegamenti a siti commerciali. –

risposta

12

One Definition Rule dice che:

se un file cpp definisce struct S { int x; }; e l'altro file cpp definisce struct S { int y; };, il comportamento del programma che li unisce è definito.

Così, il tuo programma richiama il comportamento non definito (UB). Quindi, il compilatore non è tenuto a dare una diagnosi per questo.

Se si desidera conoscere il motivo alla base, leggere this.

Spero che aiuti. :)

Problemi correlati