Given #define LOG_OBJECT(object) (NSLog(@"" #object @" %@ %@:%d”, [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
该声明LOG_OBJECT(self);
将产生:
2014-07-18 17:43:30.041 FrogCamera[12484:2144843]自我
ViewController.m:20
我希望了解预处理器代码是如何工作的。如何查看预处理器生成的语句?
具体来说:
- 为什么整个 #define 语句都包含在
( )
?
- Is
#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
See GlobalUtilities.hLOG_OBJECT 语句的起源。
这相当简单:
- 每当扩展宏可能执行意外操作时,都会使用宏中的括号。一个典型的例子是:
#define SUM(A, B) A + B
SUM(1, 1) * 3 //the expected result is 6, the real result is 1 + 1 * 3 = 4
在每个宏周围添加括号是防止此类错误的良好编程约定。
-
#param
是一个字符串化运算符。它将参数括在引号中 - 例如,参数value
被转换为"value"
.
- 字符串化运算符创建一个 C 字符串,它是一个字符数组 (
char *
)。作者想要一个NSString *
,这就是为什么他要添加一个@
在一开始的时候。注意@"aaa" "bbb"
相当于@"aaabbb"
(此功能使我们能够将字符串拆分为多行)。然而,这并不是很优雅。用一个%s
会让事情变得简单一点。
- 它仅转换为
@"" "self" @" %@ %@:%d"
。编译器将连续的字符串视为一个字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)