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.
fonte
2013-04-19 08:28:46
enumerazioni non hanno nulla a che fare con il preprocessore. –
@ Michael Burr, il codice sopra riportato in realtà viene compilato senza avvisi in MSVC6.0. Questo è C89 - come. – Vorac
Immagino che non si compili con un doppio 'u' in enum! –