1.#——字符串
假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing)。
#define PSQR(x) NSLog(@"the square of %s is %d.\n", #x, (x)*(x))
int y =4;
PSQR(y); //the square of y is 16.
PSQR(2+4);//the square of 2+4 is 36.
2.##——连接两个参数
##运算符可以使用类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。
#define XNAME(n) x##n
#define PXN(n) NSLog(@"x%s = %d\n", #n, x##n)
int XNAME(1) = 12;//int x1 = 12;
PXN(1);//NSLog(@"x1 = %d\n", x1);
3.可变宏 ... 和 __VA_ARGS__
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,以表示省略号代表什么。
#define PR(...) NSLog(__VA_ARGS__)
PR(@"hello");//hello
4、__FILE__宏在预编译时会替换成当前的源文件名
5、__LINE__宏在预编译时会替换成当前的行号
6、 __FUNCTION__ , __func__ , __PRETTY_FUNCTION__ 宏在预编译时会替换成当前的函数名称
EXAMPLE:
#define MyLog(fmf, ...) NSLog((@"%s/%d " fmf), __FUNCTION__, __LINE__, ##__VA_ARGS__)
MyLog(@"%@",@"hello,world!");//-[ViewController viewDidLoad]/60 hello,world!
#define kOS7AndLaterDeviceSystem (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1)