#d e f i n e N A M E r e s t o f l i n e
在编译时期,NAME被作为可替代的名字来进行运算,它在编译时期被替换成为rest of line.
并且宏能够定义成带参数的形式,比如:
#d e f i n e M A C (x ,y ) a r g u m e n t 1 : x a r g u m e n t 2 : y
在使用MAC的地方要按照定义进行宏展开,注意的地方是宏定义的名称不能进行重载,并且宏定义不能进行递归调用,如下:
#d e f i n e P R I N T (a ,b ) c o u t <<(a )<<(b )
#d e f i n e P R I N T (a ,b ,c ) c o u t <<(a )<<(b )<<(c ) /* trouble?: redefines, does not overload */
#d e f i n e F A C (n ) (n >1 )?n *F A C (n 1
):1 /* trouble: recursive macro */
在宏定义时最好使用/**/的注释格式,因为在展开的过程当中//会把//后面的定义给注释掉.
使用宏,用户可以定义自己编程习惯的特殊语言(BOOST当中很多都使用了该技术).
我们可以在宏定义当中使用##操作符来将拼接定义体当中的字符.
例如:
#d e f i n e N A M E 2 (a ,b ) a ##b
i n t N A M E 2 (h a c k ,c a h )();
我们就相当于定义了一个下面的函数:
i n t h a c k c a h ();
在定义完毕后,注意将这个宏函数用#undef释放掉,不然会污染名字空间,例如:
#undef NAME2
条件编译:
#ifdef arg
#endif