我正在寻找一个类似于with-construct的宏。 的使用应该是这样的:”with“macro in C
with (lock(&x), unlock(&x)) {
...
}
它可能对其他一些目的是有用的。
我想出了这个宏:
#define __with(_onenter, _onexit, v) \
for (int __with_uniq##v=1; __with_uniq##v > 0;)\
for (_onenter; __with_uniq##v > 0; _onexit) \
while (__with_uniq##v-- > 0)
#define _with(x, y, z) __with(x, y, z)
#define with(_onenter, _onexit) _with(_onenter, _onexit, __COUNTER__)
它有3个嵌套的循环,因为它应该:
- 初始化循环计数器(仅C99,当然)
- 可能初始化变量_onenter (如
with (int fd=open(..), close(fd))
) - 允许
break
在代码块内。 (continue
被允许了。而宏可以进行调整,以assert()
出来)
我用它在为XV6 OS的代码,它似乎非常有用。
我的问题是 - 这样一个宏最糟糕的问题是什么?我的意思是,除了仅仅使用C宏(尤其是实现新的控制流构造的宏)之外。
到目前为止,已经发现这些缺点/问题:
- 为
return
或goto
(但它可以节省内核代码中的一些goto
S) - 错误不支持(如
fd < 0
)不支持。我认为这是可以修复的。 - 仅gnu89/c99及以上版本(循环计数器,不需要独特的可变技巧)
- 比简单的锁定解锁效率稍差。我相信这是微不足道的。
还有其他问题吗?有没有更好的方式在C中实现类似的构造?
哦。最后回应......谢谢,我不知道“清理” - 听起来很有用。除了它的可怕程度,这个宏还有更具体的问题吗? – Elazar 2013-04-28 11:45:29
缺乏对'return'的支持似乎是一种破坏行为,除非你在函数中间使用严格的编码标准来处理'return'语句。 'with'块中的'return'看起来不显眼,但会在运行时造成严重破坏。 – pdw 2013-04-28 13:31:04
我明白了,同意'return'是一个大问题(所以'清理'要好得多)。但是'goto'不需要同样严格的编码标准吗? goto在这方面有什么优势? – Elazar 2013-04-28 13:47:13