Какова ценность константы undefined, используемой в #if?

Мой препроцессор, похоже, предположил, что константы undefined равны 0 для оценки условий #if.

На что это можно положиться, или константы undefined дают поведение undefined?

Ответ 1

Да, на это можно положиться. Стандарт C99 указывает в §6.10.1 ¶3:

После всех замен из-за расширения макроса и определенного унарного оператор был выполнен, все остальные идентификаторы заменены на pp-номер  0

Edit

Извините, я думал, что это вопрос C; все же, неважно, эквивалентный раздел в стандарте С++ (§16.1 ¶4) гласит:

После всех замен из-за расширения макроса и определенного унарного оператора были выполнены все остальные идентификаторы и ключевые слова, за исключением true и false, заменены на pp-число 0

Единственное различие заключается в различной обработке true и false, которые в C не требуют специальной обработки, тогда как в С++ они имеют особое значение даже на этапе предварительной обработки.

Ответ 2

Идентификатор, который не определяется как макрос, преобразуется в 0 до того, как выражение будет оценено.

Исключением является идентификатор true, который преобразуется в 1. Это характерно для препроцессора С++; в C этого не происходит, и вам нужно будет включить <stdbool.h> для использования true таким образом, и в этом случае он будет определен как макрос, и не требуется специальная обработка.