Il mio preprocessore sembra assumere che le costanti non definite siano 0 allo scopo di valutare le condizioni di #if
.
Si può fare affidamento su questo o le costanti non definite danno un comportamento indefinito?
Sì, può essere invocato. Lo standard C99 specifica al §6.10.1 ¶3:
Dopo che tutte le sostituzioni dovute all’espansione della macro e all’operatore definito unario sono state eseguite, tutti gli identificatori rimanenti vengono sostituiti con il numero pp
0
modificare
Scusa, pensavo fosse una domanda di C; ancora, non un grosso problema, la sezione equivalente nello standard C ++ (§16.1 ¶4) afferma:
Dopo che tutte le sostituzioni dovute all’espansione della macro e all’operatore definito unario sono state eseguite, tutti gli identificatori e le parole chiave rimanenti, ad eccezione di
true
efalse
, vengono sostituiti con il numero pp0
L’unica differenza è la diversa gestione di true
e false
, che in C non richiedono una gestione speciale, mentre in C ++ hanno un significato speciale anche nella fase di preelaborazione.
Un identificatore che non è definito come macro viene convertito in 0
prima che l’espressione venga valutata.
L’eccezione è l’identificatore true
, che viene convertito in 1
. Questo è specifico per il preprocessore C ++; in C, questo non succede e dovresti includere
per usare true
questo modo, nel qual caso sarà definito come macro e non è richiesta alcuna gestione speciale.