2013-06-09 10 views
6

Sto provando a scrivere una macchina a stati che divora un file sorgente e lo divide in sezioni che sono affari del compilatore o del preprocessore. Non un deep traversal, sto solo cercando sezioni che siano o commenti o direttive per il preprocessore. (niente macro, niente blocchi condizionati, ecc.)Dove è legale specificare una direttiva per il preprocessore?

I commenti sono abbastanza semplici, ma non sono sicuro al 100% dove sia legale specificare una direttiva per il preprocessore. Ad esempio, la seguente riga è legale?

int i; #include <derp.h> 

Esistono casi particolari in cui alcune direttive sono consentite e altre no?

Ho cercato su Google e SO e non ho trovato una domanda che risponda a questo.

Si prega di rispondere per ENTRAMBI C e C++, ho taggato sia consapevolmente che intenzionalmente.

+10

Se stai cercando di fare un parser, si dovrebbe utilizzare la grammatica definitiva per la lingua (ad esempio lo standard (s)) , piuttosto che affidarsi alle risposte date dai mortali fallibili qui su SO! –

+0

hai mai provato google? – xaxxon

+3

Sì, ho provato Google. Dice così, proprio lì nella domanda. – Wug

risposta

11

Le direttive del preprocessore possono apparire ovunque, purché siano il primo token non di spazi vuoti sulla linea. Di conseguenza, non è possibile scrivere

int i; #define ThisIsntLegal SinceItsNotAtTheStart 

ma questo sarebbe:

int i; 
#define Woohoo ThisIsLegal 

Spero che questo aiuti!

C11 Standard (N1570, ISO/IEC 9899:201x) (sezione pertinente: s6.10 Prerocessing direttive, pagina 160)

+0

Hai un link a una risorsa che dice questo? Aneddotico "lancia a un compilatore e vedi cosa fa" il test supporta questo, ma voglio vederlo per iscritto. : D – Wug

+0

@Wug: Come ho suggerito sopra, il posto dove trovarlo per iscritto è lo standard della lingua (s);) –

+1

+1. Se si desidera un collegamento standard, * C11 s6.10 Direttive preprocesso * sembra coprire questo – simonc

Problemi correlati