2013-04-19 10 views
5

Quando vengono risolti i valori enum? In altre parole, lo snippet di codice seguente è conforme agli standard?I valori enum vengono risolti in preelaborazione o in fase di compilazione?

enum{ 
    A, 
    B, 
    MAX 
} 

#if MAX > 42 
# error "Woah! MAX is a lot!" 
#endif 
+1

enumerazioni non hanno nulla a che fare con il preprocessore. –

+0

@ Michael Burr, il codice sopra riportato in realtà viene compilato senza avvisi in MSVC6.0. Questo è C89 - come. – Vorac

+2

Immagino che non si compili con un doppio 'u' in enum! –

risposta

6

Il preprocessore non ha nulla a che fare con le enumerazioni. Ma il tuo esempio viene compilato senza errori, quindi cosa sta succedendo con la direttiva #if MAX > 42?

Ogni volta che il preprocessore sta gestendo una direttiva condizionale, eventuali identificatori che non sono definiti come macro sono trattati come 0. Quindi ipotizzando che MAX non è definito altrove come una macro, il vostro pezzo di codice è equivalente a:

enum{ 
    A, 
    B, 
    MAX 
} 

#if 0 > 42 
# error "Woah! MAX is a lot!" 
#endif 

da C99 6.10.1/3 "inclusione condizionale":

... Dopo avere effettuato tutte le sostituzioni causa l'espansione delle macro e il definito operatore unario, tutti i rimanenti identificatori sono sostituito con il numero pp 0, e quindi ciascun token di preelaborazione è convertito in un token. ...

La stessa dicitura è nello standard C89/C90.

+0

Un errore stupido da parte mia! Grazie a tutti per averlo chiarito. – Vorac

Problemi correlati