1、 无参宏定义(一个简单的常量)
#dene LEN 12
这个是最常见的用法,但也会出错。
比如下面几个知识点你会吗?可以看下:
(1)#dene NAME "zhangyuncong"
程序中有"NAME"则,它会不会被替换呢?
(2)#dene 0x abcd
可以吗?也就是说,可不可以用把标识符的字母替换成别的东西?
(3)#dene NAME "zhang
这个可以吗?
(4)#dene NAME "zhangyuncong"
程序中有上面的宏定义,并且,程序里有句:
NAMELIST 这样,会不会被替换成"zhangyuncong"LIST 四个题答案都是否定的。
第一个,""内的东西不会被宏替换。这一点应该大都知道。
第二个,宏定义前面的那个必须是合法的用户标识符
第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。
第四个:只替换标识符,不替换别的东西。NAMELIST 整体是个标识符,而没有 NAME 标
识符,所以不替换。也就是说,这种情况下记住:#dene 第一位置 第二位置
(1)不替换程序中字符串里的东西。
(2)第一位置只能是合法的标识符(可以是关键字)
(3)第二位置如果有字符串,必须把""配对。
(4)只替换与第一位置完全相同的标识符还有就是老生常谈的话:记住这是简单的替换
而已,不要在中间计算结果,一定要替换出表达式之后再算。
2、 带参宏定义
比如#dene MAX(a,b) ((a)>(b)?(a):(b))
则遇到 MAX(1+2,value)则会把它替换成:
((1+2)>(value)?(1+2):(value))
注意事项和无参宏差不多。
但还是应注意
#dene FUN(a) "a"
则,输入 FUN(345)会被替换成什么?
其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。
也就是说,""内的字符不被当成形参,即使它和一模一样。
那么,你会问了,我要是想让这里输入 FUN(345)它就替换成"345"该怎么实现呢?
请看下面关于#的用法
3、 有参宏定义中#的用法
#dene STR(str) #str
#用于把宏定义中的参数两端加上字符串的""
比如,这里 STR(my#name)会被替换成"my#name"
一般由任意字符都可以做形参,但以下情况会出错:
STR())这样,编译器不会把“)”当成 STR()的参数。
STR(,)同上,编译器不会把“,”当成 STR 的参数。
STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008 为例)
STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A 第二个是