- 论坛徽章:
- 0
|
【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!
原帖由 "loef" 发表:
[quote]原帖由 "flw" 发表:
而且在宏里使用的do {}while(0)技巧同样值得注意,比如说我们定义了一个宏如下:
#define swap(x,y) {int temp = x; x = y; y = temp;}
可是在用到这个宏的时候,我们经常这么用
swap(x,y);
,注意后面的;号,在把宏展开的时候就会出问题,可是如果我们这么写,就可以避免这个问题了:
#define swap(x,y) \
do {int temp = x; x = y; y = temp;} while(0)
很精辟得用法,避免了语法错误。经典![/quote]
其实 flw 和 loef 说的是不正确的。
swap(x,y); 用第一个宏定义展开后是 {int temp = x; x = y; y = temp;}; ,这个语句最后面的 ; 不会引起错误,因为在这里它是空语句。swap(x, y); 以及 swap(x, y) 的使用形式都是可以的,后者这种使用形式有可能使 swap(x, y) 作为操作数参与表达式的运算(当然这里是不允许的,因为 {} 的存在。如果是这种形式:#define SUM(x, y) ((x) + (y)) 就可以作为操作数使用了)。
由于第二种形式的宏定义是用 do while 语句来实现的,所以它只能这样使用:swap(x, y);,不能这样使用 swap(x, y),即必须在宏调用的后面加一个 ; 才行,这是由 do while 语句的语法决定的。可见,这样做禁止了 swap(x, y) 的使用。
那么这样做的目的何在?上面已经提到过了:它是依靠 do while 的语法规定保证了宏的使用形式是 swap(x, y);,不能是 swap(x, y),从而从语法上制约了这个宏不能作为操作数来使用,就象是返回值类型为 void 的函数一样。
当然,实现这一目的还可以使用 do while 之外其它手段,如第一种宏定义形式中 {} 的使用,使它实际上也不能作为操作数来使用。 |
|