宏技巧大全
宏技巧大全
最近看到孟岩的一篇文章介绍了一个C语言的宏定义技巧,觉得颇有价值。宏定义如下:
#define RETURN switch(Exception_stack = /
Exception_stack->prev,0)default: return
看得出这是定义了一个实现C中return功能的宏RETURN,但它保证了在return之前一定会执行Exception_stack = Exception_stack->prev这个操作,而且任何场合出现的return都能用这个RETURN宏来代替。觉得很平凡吗?那好,我们来尝试其它的做法。比如:
#define RETURN_1 if(Exception_stack = /
Exception_stack->prev,1) return
这个RETURN在下面情况中有什么问题吗?
if(...)
RETURN_1 1;
else
{
// do something
....
}
我们看看宏展开后的代码:
if(...)
if(Exception_stack = Exception_stack->prev, 1)
return 1;
else
{
// do something
....
}
很明显,我们的else将会与宏定义中的if而不是第一个if匹配,这是我么想要的吗?唔,当然不是。那看看另外一个:
#define RETURN_2 return Exception_stack = /
Exception_stack->prev,
如果有这样一个函数
void foo()
{
....
return;
}
这种不带参数的return用法是合法而且相当常见的,那换成上面的RETURN_2行吗?呵呵,小不死这样的傻瓜都看得出有语法错误。当然还可以这样定义:
#define RETURN_3(_X) do{if(Exception_stack = /
Exception_stack->prev, 1) return _X}while(0)
它倒是可以在上面两种情况下使用,但是用它的时候非得带个括号,有句话说得好:“如非必要,别去打破约定俗成的习惯”。其实确实还存在一种与上述RETURN等价的宏定义:
#define RETURN_4 for(Exception_stack = /
Exception_stack->prev; ;) return
switch与for的这种用法确实值得借鉴,用得好的话在C中就可以定义出安全的宏了。