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


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

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

2 53

2 ответа:

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

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

Edit

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

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

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

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

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