[英]“with” macro in C
我正在尋找一個類似於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個嵌套循環,因為它應該:
with (int fd=open(..), close(fd))
) break
。 (也允許continue
。宏可以調整為assert()
它) 我在XV6操作系統的代碼上使用它,它看起來非常有用。
我的問題是 - 這樣一個宏的最大問題是什么? 我的意思是,除了僅僅使用C宏(特別是實現新的控制流構造的宏)。
到目前為止已發現這些缺點/問題:
return
或goto
(但它可以在內核代碼中保存一些goto
) fd < 0
)。 我認為這個是可以解決的。 還有其他問題嗎? 有沒有更好的方法在C中實現類似的構造?
那個宏嚇到我了。 我更喜歡使用goto
的傳統方法 。
這種方法很原始,但大多數C程序員都熟悉這種模式,如果不是,他們可以通過閱讀本地代碼來理解它。 沒有隱藏的行為。 因此,它非常可靠。
你的宏很聰明,但它對大多數人來說都是新的,它帶有隱藏的陷阱。 新的捐助將不得不被認為規則,如“不return
或goto
走出了一條與塊”和“ break
將爆發的與塊,沒出周圍循環”。 我擔心錯誤會很常見。
如果您可以將錯誤使用此構造的警告添加到編譯器,那么余額將會發生變化。 有了clang ,這似乎是一種選擇。 在這種情況下,將檢測到誤用,並且您的代碼將保持可移植到其他編譯器。
如果您願意將自己限制為GCC和Clang,則可以使用cleanup
屬性。 這會使你的例子看起來像這樣:
lock_t x = NULL __attribute__((cleanup(unlock)));
lock(&x);
當變量超出范圍時,將使用指向變量的指針調用unlock
。 它與其他語言功能(如return
和goto
)集成,甚至在混合C / C ++項目中也有例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.