1、 用无参宏定义一个简单的常量
#define MAX 12
这个是最常见的用法,但也会出错。
比如下面几个知识点你会吗?可以看下:
(1)#define NAME "zhangyuncong"
程序中有"NAME"则,它会不会被替换呢?[Notice: 这里说的是字符串, 它会不会被替换呢?]
(2)#define 0x abcd
可以吗?也就是说,可不可以用不是标识符的字母替换成别的东西?[Notice: 0x 肯定不是标识符, 一数字开的头]
(3)#define NAME "zhang
这个可以吗? [Notice: 只有一个quotation-mark, 后面没有]
(4)#define NAME "zhangyuncong"
程序中有上面的宏定义,并且,程序里有句: NAMELIST这样,会不会被替换成"zhangyuncong"LIST
程序中有上面的宏定义,并且,程序里有句: NAMELIST这样,会不会被替换成"zhangyuncong"LIST
四个题答案都是十分明确的。
第一个,""内的东西不会被宏替换。
第二个,宏定义前面的那个必须是合法的用户标识符
第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。
第四个:只替换标识符,不替换别的东西。NAMELIST整体是个标识符,而没有NAME标识符,所以不替换。
conclusion:
也就是说,这种情况下记住: #define 第一位置 第二位置
(1) 不替换程序中字符串里的东西。
(2) 第一位置只能是合法的标识符(可以是关键字)
(3) 第二位置如果有字符串,必须把""配对。
(4) 只替换与第一位置完全相同的标识符
还有就是:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算。
2:带参数宏的用法
second:
2:带参数宏的用法
比如#define MAX(a,b) ((a)>(b)?(a):(b))
则遇到MAX(1+2,value)则会把它替换成:
((1+2)>(value)?(1+2):(value))
如果没有加上括号会怎么样的呢?
eg. #define MAX(x,y) (x>y?x:y)
eg. #define MAX(x,y) (x>y?x:y)
MAX(1+2,value) ---> 1+2>value?1+2:value;
------------------------------------------------------------------------------------------------------------------
#define FUN(a) "a"
则,输入FUN(345)会被替换成什么?
其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。
也就是说,""内的字符不被当成形参,即使它和一模一样。
想让这里输入FUN(345)它就替换成"345"该怎么实现呢?
请看下面关于#的用法
2.1:有参数宏中关于#的使用
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开,被当做字符串处理
#用于把宏定义中的参数两端加上字符串的""
#define STR(str) #str
比如,这里STR(my#name)会被替换成"my#name"
一般由任意字符都可以做形参,但以下情况会出错:
STR())这样,编译器不会把“)”当成STR()的参数。
STR(,)同上,编译器不会把“,”当成STR的参数。
STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)
STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。
2.2:有参数宏中关于##的使用
#define WIDE(str) L##str
则会将形参str的前面加上L
比如:WIDE("abc")就会被替换成L"abc"
如果有#define FUN(a,b) vo##a##b()
那么FUN(id ma,in)会被替换成void main()
3:多行宏定义
first:
如果宏里有多过一个语句(statement),就需要用
如果宏里有多过一个语句(statement),就需要用
do { /*...*/ } while(0)
包裹成单个语句,否则会有如下的问题:
#define M() a(); b()
if (cond)
M();
else
c();
/* 预处理后 */
if (cond)
a(); b(); /* b(); 在 if 之外 */
else /* <- else 缺乏对应 if */
c();
只用 { }
也不行:
#define M() { a(); b(); }
/* 预处理后 */
if (cond)
{ a(); b(); }; /* 最后的分号代表 if 语句结束 */
else /* else 缺乏对应 if */
c();
用 do while 就行了:
#define M() do { a(); b(); } while(0)
/* 预处理后 */
if (cond)
do { a(); b(); } while(0);
else
c();
#define EXPECT_EQ_BASE(equality, expect, actual, format) \
do {\
test_count++;\
if (equality)\
test_pass++;\
else {\
fprintf(stderr, "%s:%d: expect: " format " actual: " format "\n", __FILE__, __LINE__, expect, actual);\
main_ret = 1;\
}\
} while(0)
#define doit(m,n) for(int i=0;i<(n);++i)\
{\
m+=i;\
}
reference: 点击打开链接