Каково значение неопределенной константы, используемой в #if? - PullRequest
58 голосов
/ 23 февраля 2011

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

Можно ли полагаться на это, или неопределенные константы дают неопределенное поведение?

Ответы [ 2 ]

64 голосов
/ 23 февраля 2011

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

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

Редактировать

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

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

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

14 голосов
/ 23 февраля 2011

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

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

...