如果/ else宏与BOOL的行为不同而不是数字

时间:2015-12-06 22:51:13

标签: objective-c macros

我有以下代码正常工作:

#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与使用宏中的数字不同?

1 个答案:

答案 0 :(得分:2)

预处理器是标准的 C 预处理器,适用于由数字常量组成的非常有限的表达式。预处理器表达式中的任何非宏标识符都被视为具有值0

Objective-C NO不是数字的宏,而是_objc_no,而不是数字而是非宏标识符 - 因此在条件表达式中它将被视为0。与YES相同。

所以你的:

#if TEST == YES

原来是:

#if 0 == 0

TESTYES还是NO

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