我有以下代码正常工作:
#define TEST 0
#if TEST == 1
#define URL @"example.com"
#else
#define URL @"not-example.com"
#endif
因此,在这种情况下,URL
将按预期not-example.com
。
现在,我想使用BOOL而不是0和1.但是,当我尝试以下代码时,它给出了错误的答案:
#define TEST NO
#if TEST == YES
#define URL @"example.com"
#else
#define URL @"not-example.com"
#endif
这使我URL
等于example.com
。如果TEST
设置为YES
,则会给出相同的答案。
为什么使用BOOL与使用宏中的数字不同?
答案 0 :(得分:2)
预处理器是标准的 C 预处理器,适用于由数字常量组成的非常有限的表达式。预处理器表达式中的任何非宏标识符都被视为具有值0
。
Objective-C NO
不是数字的宏,而是_objc_no
,而不是数字而是非宏标识符 - 因此在条件表达式中它将被视为0
。与YES
相同。
所以你的:
#if TEST == YES
原来是:
#if 0 == 0
TEST
是YES
还是NO
。
有关详细信息,请参阅C Preproccesor: Conditionals(来自GCC,但同样适用于Clang / Xcode和其他C编译器。)