Mein Verständnis für eine lange Zeit war, dass eine C ++ Übersetzungseinheit , nachdem der Präprozessor ausgeführt wurde, ist eine Folge von Deklarationen (lassen Sie mich daran erinnern, dass alle Definition ist auch eine Deklaration).
Viele Leute haben mit dieser Aussage argumentiert, aber niemand hat jemals ein Gegenbeispiel gegeben. Aber ich selbst fand dieses Beispiel, das mich beunruhigt: %Vor%Dies kompiliert gut mit MSVC und online comeau. Ich weiß, dass der Standard eine leere Anweisung definiert , aber ich habe noch nie von einer leeren Deklaration gehört. Also, ich sehe drei Möglichkeiten:
Bitte helfen Sie mir, meine Zweifel aufzulösen. Danke
Eine leere Deklaration ist im Dateibereich (und im Namespace-Bereich und an anderen Stellen, an denen eine Deklaration erlaubt ist) im C ++ 0x-Code erlaubt und ist nur ein Semikolon. Es ist eine eigenständige grammatikalische Einheit.
In C ++ 03 ist ein einzelnes Semikolon nicht erlaubt, wenn nur eine Deklaration erwartet wird. Auch wenn eine einfache Deklaration möglicherweise nur auf ein Semikolon reduziert werden kann, wird dies durch eine explizite Regel nicht zugelassen.
7 [dcl.dcl] / 3
In einer einfachen Deklaration kann die optionale init-declator-list nur weggelassen werden, wenn eine Klasse (Klausel 9) oder eine Enumeration (7.2) deklariert wird, dh wenn decl -specifier-seq enthält entweder einen Klassenspezifizierer , einen Typspezifizierer mit einem Klassenschlüssel (9.1) oder ein enum-specifier .
Kurz gesagt bedeutet dies, dass die init-declarator-list nur weggelassen werden kann, wenn decl-specifier-seq nicht weggelassen wird.
Ihr Verständnis ist korrekt und der Standard (oder zumindest Stroustrup) definiert eine leere Deklaration .
BEARBEITEN : Es scheint, dass diese Antwort falsch ist (es gibt eine semantische Regel auf dem Standard - aber nicht auf dem Buch, soweit ich das beurteilen kann), die sowohl decl-specified-seq
als auch init-declarator-list
verbietet. gleichzeitig leer sein). Siehe Charles Baileys Antwort.
n "Die C ++ Programmiersprache", Anhang A, Abschnitt A.4:
%Vor%Ein Programm ist eine Sammlung von
translation-unit
s (...). Atranslation-unit
, oft eine Quelldatei genannt, ist eine Sequenz vondeclaration
s:
opt
bedeutet, dass die Produktion optional ist. In dieser Regel bedeutet dies, dass eine leere Übersetzungseinheit gültig ist.
Abschnitt A.7:
%Vor% So declaration-seq
ist eine Folge von mindestens einem declaration
. A declaration
kann unter anderem ein block-declaration
sein, was wiederum simple-declaration
ergibt. Da sowohl die Nicht-Literale decl-specified-seq
als auch init-declarator-list
optional sind, ist ;
eine gültige Deklaration.
Tags und Links c++ grammar declaration