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.
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.
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.
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.
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.
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."
Tags und Links c syntax language-lawyer c-preprocessor conditional-compilation