我正在尋找一個類似於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