下面的代码产生输出“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
答案 0 :(得分:4)
NO
的价值是多少?如果它未定义(例如YES
),它们将evaluate to 0。
这意味着你的表达基本上是
#if 0 == 0
当然是正确的,因此会导致第一次调用被编译。
更新:不确定如何定义BOOL
,但在处理预处理器时,转换为可能是typedef
:ed类型的东西并不是一个好主意。请记住,#if
由预处理器评估,而不是由编译器评估。阅读this之类的内容,了解有关预处理器中表达式的更多信息。特别是:
预处理器对语言中的类型一无所知。
答案 1 :(得分:4)
预处理器不知道的所有标识都被0
替换为#if
指令中的评估。如果您没有定义YES
和NO
两者都是0
(因此相等)。