In Bezug auf das Parsen von Präprozessor-Direktiven war dem C99-Standard (und dem C89-Standard davor) die Reihenfolge der vom Compiler logisch ausgeführten Operationen klar. Insbesondere glaube ich, dass dies bedeutet, dass dieser Code:
/* */ # /* */ include /* */ <stdio.h> /* */
ist äquivalent zu:
#include <stdio.h>
Ob gut oder schlecht, GCC 3.4.4 mit '-std = c89 -pedantic' akzeptiert jedenfalls die kommentarreiche Zeile. Ich befürworte das nicht als Stil - nicht für eine Sekunde (es ist schrecklich). Ich denke nur, dass es möglich ist.
ISO / IEC 9899: 1999 Abschnitt 5.1.1.2 Übersetzungsphasen besagen:
[Zeichenzuordnung, einschließlich Trigraphen]
[Linienspleißen - Entfernen von Backslash-Zeilenumbrüchen]
Die Quelldatei wird in Vorverarbeitungstoken und Sequenzen von Leerzeichen (einschließlich Kommentaren) zerlegt. Eine Quelldatei darf nicht mit einem Teilvorverarbeitungstoken oder einem Teilkommentar enden. Jeder Kommentar wird durch ein Leerzeichen ersetzt. Zeilenumbrüche bleiben erhalten. Ob jede nicht leere Folge von anderen Leerzeichen als Zeilenumbrüchen beibehalten oder durch ein Leerzeichen ersetzt wird, ist implementierungsdefiniert.
Vorverarbeitungsanweisungen werden ausgeführt, Makroaufrufe werden erweitert, [...]
In Abschnitt 6.10 Richtlinien zur Vorverarbeitung heißt es:
Eine Vorverarbeitungsanweisung besteht aus einer Folge von Vorverarbeitungstoken, die mit einem # Vorverarbeitungstoken beginnt, das (zu Beginn der Übersetzungsphase 4) entweder das erste Zeichen in der Quelldatei ist (optional nach Leerzeichen, die keine Zeilenumbrüche enthalten) oder das folgt einem Leerzeichen mit mindestens einem Zeilenumbruchzeichen und wird durch das nächste Zeilenumbruchzeichen beendet.
Der einzig mögliche Streit ist der Klammerausdruck "(zu Beginn der Übersetzungsphase 4)", was bedeuten könnte, dass die Kommentare vor dem Hash fehlen müssen, da sie bis zum Ende von Phase 4 nicht durch Leerzeichen ersetzt werden.
Wie andere angemerkt haben, verhielten sich die C-Präprozessoren vor dem Standard in vielerlei Hinsicht nicht einheitlich, und Leerzeichen vor und in Präprozessor-Direktiven waren einer der Bereiche, in denen verschiedene Compiler unterschiedliche Aufgaben ausführten, einschließlich der Nichterkennung von Präprozessor-Direktiven mit Leerzeichen vor ihnen .
Es ist bemerkenswert, dass das Entfernen von Backslash-Newline erfolgt, bevor Kommentare analysiert werden. Folglich sollten Sie //
Kommentare nicht mit einem Backslash beenden .