-------------------------------------------------
关于预编译宏命令的笔记
——————————————————————————
【以下参考自:http://blog.chinaunix.net/uid-22878837-id-2110544.html】
常见宏 ##__VA_ARGS__, __FILE__, __LINE__ 和__FUNCTION__,下面介绍一下这几个宏:
2) __FILE__ 宏在预编译时会替换成当前的源文件名
3) __LINE__宏在预编译时会替换成当前的行号
4) __FUNCTION__宏在预编译时会替换成当前的函数名称
【以下部分转自:http://www.cnblogs.com/morewindows/archive/2011/08/18/2144112.html】
宏中的#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号。
如定义好#define STRING(x) #x之后,下面二条语句就等价。
还有一个#@是加单引号(Charizing Operator)
#define makechar(x)
但有小问题要注意,宏中遇到#或##时就不会再展开宏中嵌套的宏了。什么意思了?比如使用char *pChar = STRING(__FILE__);虽然__FILE__本身也是一个宏,但编译器不会展开它,所以pChar将指向"__FILE__"而不是你要想的形如"D:\XXX.cpp"的源文件名称。因此要加一个中间转换宏,先将__FILE__解析成"D:\XXX.cpp"字符串。
定义如下所示二个宏:
#define _STRING(x) #x
#define STRING(x) _STRING(x)
再调用下面语句将输出带""的源文件路径
可以比较下STRING(__FILE__)与__FILE__的不同,前将带双引号,后一个没有双引号。
再讲下##的功能,它可以拼接符号(Token-pasting operator)。
MSDN上有个例子:
#define paster( n ) printf( "token"#n" = %d\n", token##n )
int token9 = 100;
再调用
printf( "token""9"" = %d", token9 );
在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于
printf("token9 = %d", token9);。
即输出token9 = 100——————————————————————————
NSLog自定义Format的问题
——————————————————————————
【参考:http://blog.csdn.net/tangaowen/article/details/8096624】
在使用宏命令预编的时候发现,形如这样的组合会报错:
NSString* baseFormat = @"Hello %@";
NSString* argsWorld = @"World";
NSLog(baseFormat,argsWorld);
报错:Format string is not a string literal (potentially insecure)
原因:NSLog为了安全,只接受格式化的字符串,因为NSLog底层也是用printf来格式化输出的。
一种解决方案:
NSString* logString = [NSString stringWithFormat: @"Hello %@", @"World");
NSLog(@"%@",logString);
——————————————————————————————————
自己写的Log头文件KingsLog.h
——————————————————————————————————
使用方式:
因为需要控制在某个文件中输出某个级别的Log信息,所以没有把文件放在pch中,而是在每个需要用log的文档中的开头如下使用:
#define KingsLogActivated//若不想输出当前文件中的Log,则把该定义注释掉
#import "KingsLog.h"
——————————————————————————————————————————
代码
——————————————————————————————————————————
#ifndef ___KingsLog_h
#define ___KingsLog_h
#ifdef KingsLogActivated
#define nsFileString [[NSString stringWithUTF8String:__FILE__] substringFromIndex:1+[[NSString stringWithUTF8String:__FILE__] rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharacte
#define kingsLogString(logType,format,...) [NSString stringWithFormat:@"\n%s [Line %d in %@]:\n\t%@",logType,__LINE__,nsFileString,[NSString stringWithFormat:format, ##__VA_ARGS__]]
//#define kingsLogString(logType,format,...) [NSString stringWithFormat:@"\n%s [Line %d at %s in %@]:\n\t%@",logType,__LINE__,__FUNCTION__,nsFileString,[NSString stringWithFormat:format, ##__VA_ARGS__]]
//日志分级制度
#else
#endif
#endif
————————————————————
调用方法
————————————————————
WarnLog(@"normalViewController Find keyword: %@",keyWord);
————————————————————————————————
输出效果
————————————————————————————————
2014-03-13 14:00:52.785 kings[808:60b]
InfoLog [Line 103 in NormalScanViewController