2016-05-13 12 views
8

Wie pro Buch Die C++ Programmiersprache (Bjarne Stroustrup), in Abschnitt 15.2.3 (die Definition Regel) Seite nicht 425, ich schreibe Programm wie folgt:Struktur mit dem gleichen Namen, aber unterschiedlichem Mitglied in C++

file1.cpp

struct S2 { int a; char b; }; 

file2.cpp

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

ich unter Befehl versucht zu kompilieren.

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

und

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

Beide dieser Befehl ohne jeden Fehler oder eine Warnung ausführbaren erzeugen. Aber laut Buch sollte dieses Beispiel einen Fehler geben.

+0

Ich bin mir nicht sicher, ob dies eine Verletzung der * eine Definitionsregel * (ODR) ist oder nicht. Wenn dies jedoch der Fall ist, ist der Compiler * nicht * erforderlich, um einen Fehler zu geben - es bedeutet lediglich, dass der Programmierer einen Fehler gemacht hat. –

+0

@MartinBonner: Ja, das ist eine klare Verletzung von ODR. Du hast recht. Compiler ist nicht erforderlich, um einen Fehler zu geben – Destructor

+2

Bitte keine Links zu kommerziellen Websites einfügen. –

Antwort

12

One Definition Rule sagt, dass:

wenn eine CPP-Datei struct S { int x; }; und die andere CPP Datei definiert definiert struct S { int y; };, das Verhalten des Programms, das sie zusammen verbindet, ist undefined.

Ihr Programm ruft also undefined Verhalten (UB). Compiler ist also nicht erforderlich, um die Diagnose zu stellen. Wenn Sie den Grund dafür wissen wollen, dann lesen Sie this.

Ich hoffe, es hilft. :)