2012-10-04 106 views
4

下面的代码产生输出“yes defined”,“no defined”和“yes”。为什么?预处理器宏和BOOL奇怪

#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 
+0

编译器bug ...? – 2012-10-04 10:09:24

回答

4

什么是NO价值?如果它未定义(如YES),则它们都将是​​。

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

#if 0 == 0 

这当然是正确的,从而使要编译的第一个呼叫。

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

预处理程序不知道语言中的类型。

+0

但为什么YES等于0?它是1 –

+1

预处理程序不理解类型的点似乎是我的答案。预处理器可以将'0'与'1'进行比较,但不能用'(BOOL)1'对'(BOOL)0'进行比较。 – ugoren

4

预处理程序不知道的所有标识符均被替换为0以用于#if指令中的评估。如果您没有定义YESNO,则两者均为0(因此相等)。