2013-06-09 15 views
6

Ich versuche, eine Zustandsmaschine zu schreiben, die eine Quelldatei schlürft und sie in Abschnitte aufteilt, die entweder das Geschäft des Compilers oder das des Präprozessors betreffen. Nicht ein tiefes Traversal, ich suche nur nach Abschnitten, die entweder Kommentare oder Präprozessordirektiven sind. (keine Makros, keine bedingt kompilierten Blöcke usw.)Wo ist es legal, eine Präprozessordirektive anzugeben?

Kommentare sind einfach genug, aber ich bin mir nicht 100% sicher, wo es legal ist, eine Präprozessordirektive anzugeben. Ist zum Beispiel die folgende Zeile legal?

int i; #include <derp.h> 

Gibt es spezielle Fälle, in denen einige Direktiven erlaubt sind und andere nicht?

Ich habe google und SO gesucht und keine Frage gefunden, die dies beantwortet.

Bitte antworten Sie für BEIDE C und C++, markierte ich wissentlich und absichtlich.

+10

Wenn Sie versuchen, einen Parser zu machen, sollten Sie wirklich die endgültige Grammatik für die Sprache verwendet werden (dh der Norm (en)) , anstatt sich auf die Antworten fehlbarer Sterblicher hier auf SO zu verlassen! –

+0

hast du sogar google probiert? – xaxxon

+3

Ja, ich habe google probiert. Es sagt so, genau dort in der Frage. – Wug

Antwort

11

Präprozessordirektiven können überall vorkommen, solange sie das erste Nicht-Leerzeichen-Token in der Zeile sind. Dementsprechend können Sie nicht

int i; #define ThisIsntLegal SinceItsNotAtTheStart 

schreiben Aber das wäre:

int i; 
#define Woohoo ThisIsLegal 

hoffe, das hilft!

C11 Standard (N1570, ISO/IEC 9899:201x) (Relevante Abschnitt: s6.10 Prerocessing Richtlinien, Seite 160)

+0

Haben Sie einen Link zu einer Ressource, die das sagt? Anekdotische "werfen es auf einen Compiler und sehen, was es tut" Tests unterstützt dies, aber ich möchte es schriftlich sehen. : D – Wug

+0

@Wug: Wie ich oben vorgeschlagen habe, ist der Ort, um dies schriftlich zu finden, die Sprachnorm (en);) –

+1

+1. Wenn Sie einen Standard-Link wollen, * C11 s6.10 Preprocessing Direktiven * scheint dies zu bedecken – simonc

Verwandte Themen