If/else 宏对 BOOL 的行为与对数字的行为不同
If/else macros behaving differently with BOOL than with numbers
我有以下代码可以正常工作:
#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 与使用数字不同?
预处理器是标准的 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 编译器。)
我有以下代码可以正常工作:
#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 与使用数字不同?
预处理器是标准的 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 编译器。)