宏的优点:
1、编译优化和方便。
2、极强以及跨平台能力。
3、漂亮的代码。
C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like macro)。
对象宏,对象宏一般用来定义一些常数。
例:
//This defines PI
#define M_PI 3.14159265358979323846264338327950288
#define关键字表明即将开始定义一个宏,紧接着的M_PI是宏的名字,空格之后的数字是内容。类似这样的#define X A的宏是比较简单的,在编译时编译器会在语义分析认定是宏后,将X替换为A,这个过程称为宏的展开。
函数宏,就是行为类似函数,可以接受参数的宏。具体来说,在定义的时候,如果我们在宏名字后面跟上一对括号的话,这个宏就变成了函数宏。
例:
//A simple function-like macro
#define SELF(x) x
NSString *name = @"Macro Rookie";
NSLog(@"Hello %@",SELF(name));
// => NSLog(@"Hello %@",name);
// => Hello Macro Rookie
这个宏做的事情是,在编译时如果遇到SELF,并且后面带括号,并且括号中的参数个数与定义的相符,那么就将括号中的参数换到定义的内容里去,然后替换掉原来的内容。 具体到这段代码中,SELF接受了一个name,然后将整个SELF(name)用name替换掉。
多个参数的宏。
例:
#define PLUS(x,y) x + y
printf("%d",PLUS(3,2));
// => printf("%d",3 + 2);
// => 5
相比对象宏来说,函数宏要复杂一些。
实现一个函数宏,
例:给定两个数字输入,将其替换为较小的那个数。
#define MIN(A,B) (A) < (B) ? (A) : (B)
那么问题来了,
例:
float a = 1.0f;
float b = MIN(a++, 1.5f);
printf("a=%f, b=%f",a,b);
// => a=3.000000, b=2.000000