Grammatik einer C ++ Übersetzungseinheit

8

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:

  • Mein Verständnis ist korrekt und der Standard definiert eine leere Deklaration
  • Mein Verständnis ist korrekt, aber der Standard definiert keine leeren Deklarationen, und die obige Übersetzung ist schlecht formuliert
  • Mein Verständnis ist falsch, d. h. eine C ++ TU ist keine Abfolge von Deklarationen

Bitte helfen Sie mir, meine Zweifel aufzulösen. Danke

    
Armen Tsirunyan 02.12.2010, 12:35
quelle

2 Antworten

4

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.

    
Charles Bailey 02.12.2010, 16:52
quelle
6

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:

  

Ein Programm ist eine Sammlung von translation-unit s (...). A translation-unit , oft eine Quelldatei genannt, ist eine Sequenz von declaration s:

%Vor%

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.

    
Pedro d'Aquino 02.12.2010 13:02
quelle

Tags und Links