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 的宏,它不是数字而是非宏标识符 - 所以在条件表达式中它将被视为 0YES.

相同

所以你的:

#if TEST == YES

原来是:

#if 0 == 0

TESTYES 还是 NO

有关详细信息,请参阅 C Preproccesor: Conditionals(来自 GCC,但同样适用于 Clang/Xcode 和其他 C 编译器。)