预处理器宏和BOOL古怪

时间:2012-10-04 09:59:56

标签: objective-c c-preprocessor

下面的代码产生输出“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

2 个答案:

答案 0 :(得分:4)

NO的价值是多少?如果它未定义(例如YES),它们将evaluate to 0

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

#if 0 == 0

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

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

  

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

答案 1 :(得分:4)

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