4

下面的代码产生输出“yes defined”、“no defined”和“yes”。为什么?

#define FOOBAR NO
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#ifdef YES
    NSLog(@"yes defined");
#endif

#ifdef NO
    NSLog(@"no defined");
#endif

#if FOOBAR == YES
    NSLog(@"yes");
#else
    NSLog(@"no");
#endif
    // ...
}

YES 和 NO 不是未定义的,objc.h 将它们定义为:

typedef signed char     BOOL;
#define YES             (BOOL)1
#define NO              (BOOL)0
4

2 回答 2

4

的价值是NO多少?如果它是未定义的(如YES),它们都将评估为 0

这意味着你的表达本质上是

#if 0 == 0

这当然是正确的,因此会导致第一次调用被编译。

更新:不确定如何BOOL定义,但在处理预处理器时,转换为可能是typedef:ed 类型并不是一个好主意。请记住,#if由预处理器而不是编译器评估。阅读类似这样的内容以获取有关预处理器中表达式的更多信息。尤其:

预处理器对语言中的类型一无所知。

于 2012-10-04T10:07:38.437 回答
4

预处理器不知道的所有标识符都替换为指令0中的评估。#if如果您没有定义YES并且NO两者都是0(因此相等)。

于 2012-10-04T10:07:57.563 回答