试看以下宏:
#define ADD_A_B(a,b) a+=1; \
b+=1;
int i,j;
i = j =0;
while (j<10)
ADD_A_B
这样貌似没什么错,但展开之后会发现这是一个bug,愿意是b到10的时候就退出循环,但展开之后却是:
while(j<10)
i += 1;
j += 1;
b的值在从未发生改变,所以程序就死在这里了。加上do{}while(0)
#define ADD_A_B(a,b) do { a += 1; \
b += 1; \
} while(0)
展开之后就成了
while (j<10)
do {
i += 1;
j += 1;
} while(0)
宏后面加上一个分号;OK。
阅读(1196) | 评论(0) | 转发(0) |