Muss '#' - Zeichen am Anfang einer Zeile im C-Präprozessor stehen? [Duplikat]

8

Ich habe C schon eine ganze Weile programmiert. Während dieser Zeit habe ich gelernt, dass es eine übliche Konvention ist, das "#" - Zeichen vor Präprozessor-Direktiven in Spalte eins zu setzen.

Beispiel:

%Vor%

Wenn Leute ihre Präprozessordirektiven einrücken, tun sie das normalerweise so:

%Vor%

Ich glaube nicht, dass ich jemals jemanden gesehen habe, der es so formatiert:

%Vor%

Meine Frage ist, ob der C-Sprachstandard verlangt, dass das # -Zeichen in der ersten Spalte steht.

Also ist die dritte Option sogar legal?

Wenn alle oben genannten Fälle legal sind, möchte ich wissen, ob dies legal ist.

%Vor%

Hier ist die #endif nicht länger auf dem "Start" der Zeile, da andere Zeichen als Leerzeichen vorhanden sind.

Was am letzten Beispiel seltsam anmutet, ist, dass Vim text-editor das #endif , das nach dem Kommentar kommt, nicht hervorhebt.

Alle diese Beispiele, die ich kompiliert habe ohne Warnungen mit gcc mit den -Wall -pedantic -Flags eingeschaltet (einschließlich der letzte mit einem Kommentar vor #endif ).

Beachten Sie, dass ich nur neugierig auf die Syntax bin. Ich setze # -Zeichen immer in Spalte eins wie alle anderen auch, wenn ich Programme programmiere. Ich würde niemals in ernsthaften Projekten Dinge wie ++i; #endif schreiben.

    
wefwefa3 09.01.2015, 23:42
quelle

2 Antworten

12

In einigen Prä-Standard-C-Präprozessoren (dh vor 1989) haben die Präprozessoren # nur am Anfang der Zeile erkannt.

Da nach den C89 / C90-Standards der Präprozessor das # als erstes nicht-leeres Zeichen in der Zeile erkennen muss (und auch die C99- und C11-Standards), ist es nun vollkommen legitim, die Anweisungen einzufügen und Es war praktisch für sogar tragbaren Code, dies für das ganze Millennium zu tun.

In ISO / IEC 9899: 2011 (der C11-Standard), Abschnitt 6.10 Vorverarbeitungsrichtlinien heißt es:

  

Eine Preprocessing-Direktive besteht aus einer Sequenz von Vorverarbeitungstoken, die die Anforderungen erfüllt   Folgende Einschränkungen: Das erste Token in der Sequenz ist ein # Vorverarbeitungstoken, das (bei   Der Beginn der Übersetzungsphase 4) ist entweder das erste Zeichen in der Quelldatei (optional)   nach Leerraum, der keine neuen Zeilen enthält) oder nach Leerraum   enthält mindestens ein Zeilenvorschubzeichen.

Die Übersetzungsphasen sind in Abschnitt 5.1.1.2 Übersetzungsphasen definiert.

  
  1. Die Quelldatei wird in Vorverarbeitungstoken 7) und Sequenzen von   Leerzeichen (einschließlich Kommentare). Eine Quelldatei darf nicht in a enden   Teilvorverarbeitungstoken oder in einem Teilkommentar. Jeder Kommentar wird durch ersetzt   ein Leerzeichen. Zeichen für neue Zeilen bleiben erhalten. Ob jeder nicht leer ist   Die Reihenfolge der Leerzeichen, die nicht in der neuen Zeile enthalten sind, wird beibehalten oder ersetzt durch   Ein Leerzeichen ist implementierungsdefiniert.

  2.   
  3. Vorverarbeitungsdirektiven werden ausgeführt, Makroaufrufe werden erweitert und   _Pragma unäre Operatorausdrücke werden ausgeführt. Wenn eine Zeichenfolge, die   Übereinstimmung mit der Syntax eines universellen Charakternamens wird durch Token erzeugt   Verkettung (6.10.3.3), das Verhalten ist nicht definiert. A #include Vorverarbeitung   Anweisung bewirkt, dass der benannte Header oder die Quelldatei aus Phase 1 verarbeitet wird   durch Phase 4 rekursiv. Alle Vorverarbeitungsdirektiven werden dann gelöscht.

  4.   

Gelegentlich finden Sie Kodierungsstandards, die aus den 1980er Jahren stammen und die immer noch ' # am Anfang der Zeile' festlegen.

Normalerweise präge ich keine Präprozessordirektiven, aber das ist legitim.

    
Jonathan Leffler 10.01.2015, 00:00
quelle
5

Nein, und hier ist ein Zitat aus dem C-Standard (ab Abschnitt 6.10):

  

Eine Preprocessing-Direktive besteht aus einer Folge von Preprocessing-Tokens, die die Anforderungen erfüllt   Folgende Einschränkungen: Das erste Token in der Sequenz ist ein # Vorverarbeitungstoken, das (bei   der Beginn der Übersetzungsphase 4) ist entweder das erste Zeichen in der Quelldatei (optional nach Leerraum, das keine neuen Zeilen enthält) oder folgt dem Leerraum   enthält mindestens ein Zeilenvorschubzeichen.

Es ist also ein # am Anfang der Datei oder nach einigen Leerzeichen, die mindestens ein neues Zeilenzeichen enthalten .

Dies bedeutet:

%Vor% Die Definition von

foo ist in Ordnung, weil # das erste Token in der Datei ist. Die Definition von bar ist in Ordnung, da der # "einem Leerraum folgt, der mindestens ein neues Zeilenzeichen enthält."

    
Cornstalks 10.01.2015 00:03
quelle