这是完整的程序。你能找出它的控制台输出吗?
#import <Foundation/Foundation.h>
#define kEnv YES
#if kEnv
#define x @"abc"
#else
#define x @"xyz"
#endif
#define kVersion true
#if kVersion
#define y @"abc"
#else
#define y @"xyz"
#endif
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"x: %@; y: %@", x, y);
NSLog(@"%@", kEnv ? @"abc" : @"cba");
NSLog(@"%@", kVersion ? @"abc" : @"cba");
}
return 0;
}
在继续之前,您可以自行复制和粘贴、运行并检查结果。
输出是:
x: xyz; y: abc
abc
abc
谁能解释一下原因吗?
YES
被定义为__objc_yes
在 中,这是一个编译器级符号,预处理器不知道。
(我的机器上是/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/objc.h。)
您可以通过执行以下操作来查看定义
#define T(X) #X
#define S(X) T(X)
printf("YES is: \"%s\"\n", S(YES));
C 预处理器是一个有趣的野兽。 :)
编辑:为什么
#if __objc_yes
表现得好像__objc_yes
是假的吗?因为__objc_yes
预处理器完全不知道;只有编译器知道。这是来自manual https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/If.html#If到 GNU 预处理器,但我相信它反映了标准,关于后面的表达式#if
可以包含:
[...]非宏的标识符,都被认为是数字零。 [...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)