鉴于#define LOG_OBJECT(object) (NSLog(@"" #object @" %@ %@:%d”, [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
声明LOG_OBJECT(self);
将产生:解读下预预处理器代码
2014年7月18日17:43:30.041 FrogCamera [12484:2144843]自 ViewController.m:20
我想了解预处理器代码的工作原理。我怎样才能看到预处理器产生的声明?
具体做法是:
- 为什么整个#define语句被包裹在
()
? - 是
#object
是否提供了一个文字替换提供了什么价值? - 为什么要求
@""
之前#object
? - 即是如何将
@“” #object @“ %@ %@:%d”
转换为@"self %@ %@:%d"
?
下面是一个使用示例:
@interface ViewController()
#define LOG_OBJECT(object) (NSLog(@"" #object @" %@ %@:%d", [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
LOG_OBJECT(self);
// = 2014-07-18 17:48:19.439 FrogCamera[12597:2151087] self <ViewController: 0x79755000> ViewController.m:20
(NSLog(@"self %@ %@:%d", [self description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
// = 2014-07-18 17:48:19.440 FrogCamera[12597:2151087] self <ViewController: 0x79755000> ViewController.m:21
}
@end
为LOG_OBJECT声明的起源见GlobalUtilities.h。
基于C,2.'#'是一个运算符。 4.相邻的字符串文字是连接的。 – chris