45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:宏技巧大全

宏技巧大全

2016-08-27 06:14:23 来源:www.45fan.com 【

宏技巧大全

最近看到孟岩的一篇文章介绍了一个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中就可以定义出安全的宏了。

 


本文地址:http://www.45fan.com/a/question/68158.html
Tags: 一个 技巧 最近
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部