Каково значение неопределенной константы, используемой в #if?
мой препроцессор, похоже, предполагает, что неопределенные константы равны 0 для оценки #if
условиях.
можно ли на это полагаться, или неопределенные константы дают неопределенное поведение?
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
таким образом, в этом случае он будет определен как макрос и никакой специальной обработки не требуется.