我正在寻找一个类似于 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 OS 的代码中使用了它,它看起来非常有用。
我的问题是 - 这种宏最严重的问题是什么?我的意思是,除了仅使用 C 宏(尤其是实现新控制流构造的宏)之外。
到目前为止已经发现了这些缺点/问题:
- 不支持
return
orgoto
(但它可以goto
在内核代码中节省一些 s) - 不支持错误(例如
fd < 0
)。我认为这个是可以修复的。 - 仅限 gnu89 / c99 及更高版本(循环计数器。不需要唯一变量技巧)
- 比简单的锁定解锁效率要低一些。我相信它是微不足道的。
还有其他问题吗?有没有更好的方法在 C 中实现类似的构造?