C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like macro)。
预定义宏:
1、预定义宏的行为是由编译器指定的。
2、前后双下杠的一般都是预定义。
2、__COUNTER__是一个预定义的宏,这个值在编译过程中将从0开始计数,每次被调用时加1。
3、__FILE__返回当前文件的绝对路径。
4、__LINE__返回展开该宏时在文件中的行数。
5、__func__是改宏所在scope的函数名称。
6、__VA_ARGS__表示的是宏定义中的...中的所有剩余参数。
7、输出rect,size和point的宏:
- #define NSLogRect(rect) NSLog(@"%s x:%.4f, y:%.4f, w:%.4f, h:%.4f", #rect, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)
- #define NSLogSize(size) NSLog(@"%s w:%.4f, h:%.4f", #size, size.width, size.height)
- #define NSLogPoint(point) NSLog(@"%s x:%.4f, y:%.4f", #point, point.x, point.y)
8、使用({...})的形式。这种形式的语句可以类似很多脚本语言,在顺次执行之后,会将最后一次的表达式的赋值作为返回。举个简单的例子,下面的代码执行完毕后a的值为3,而且b和c只存在于大括号限定的代码域中:
- int a = ({
- int b = 1;
- int c = 2;
- b + c;
- });
- // => a is 3
9、##在宏中是一个特殊符号,它表示将两个参数连接起来这种运算。
10、#单个井号的作用是字符串化,简单来说就是将替换后在两头加上”“,转为一个C字符串。