【发布时间】:2013-04-24 16:59:25
【问题描述】:
我正在寻找一个类似于 with-construct 的宏。 用法应该是这样的:
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 操作系统的代码上使用了它,它看起来很有用。
我的问题是 - 这种宏最严重的问题是什么?我的意思是,除了仅仅使用 C 宏(尤其是实现新的控制流结构的宏)之外。
到目前为止已经发现了这些缺点/问题:
- 不支持
return或goto(但它可以在内核代码中节省一些gotos) - 不支持错误(例如
fd < 0)。我认为这个是可以修复的。 - 仅限 gnu89 / c99 及以上版本(循环计数器。不需要唯一变量技巧)
- 比简单的锁定解锁效率稍低。我认为它微不足道。
还有其他问题吗?有没有更好的方法在 C 中实现类似的构造?
【问题讨论】:
标签: c c-preprocessor with-statement