Qual è il valore di una costante non definita utilizzata in #if?

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 e false , vengono sostituiti con il numero pp 0

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.