簡體   English   中英

C中的“with”宏

[英]“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個嵌套循環,因為它應該:

  1. 初始化循環計數器(當然只有C99)
  2. 可能初始化變量_onenter(例如with (int fd=open(..), close(fd))
  3. 允許在代碼塊內部break (也允許continue 。宏可以調整為assert()它)

我在XV6操作系統的代碼上使用它,它看起來非常有用。

我的問題是 - 這樣一個宏的最大問題是什么? 我的意思是,除了僅僅使用C宏(特別是實現新的控制流構造的宏)。

到目前為止已發現這些缺點/問題:

  1. 不支持returngoto (但它可以在內核代碼中保存一些goto
  2. 不支持錯誤(例如fd < 0 )。 我認為這個是可以解決的。
  3. 僅限gnu89 / c99及以上版本(循環計數器。不需要唯一的變量技巧)
  4. 比簡單的鎖定解鎖效率低一些。 我認為這是微不足道的。

還有其他問題嗎? 有沒有更好的方法在C中實現類似的構造?

那個宏嚇到我了。 我更喜歡使用goto的傳統方法

這種方法很原始,但大多數C程序員都熟悉這種模式,如果不是,他們可以通過閱讀本地代碼來理解它。 沒有隱藏的行為。 因此,它非常可靠。

你的宏很聰明,但它對大多數人來說都是新的,它帶有隱藏的陷阱。 新的捐助將不得不被認為規則,如“不returngoto走出了一條與塊”和“ break將爆發的與塊,沒出周圍循環”。 我擔心錯誤會很常見。

如果您可以將錯誤使用此構造的警告添加到編譯器,那么余額將會發生變化。 有了clang ,這似乎是一種選擇。 在這種情況下,將檢測到誤用,並且您的代碼將保持可移植到其他編譯器。

如果您願意將自己限制為GCC和Clang,則可以使用cleanup屬性。 這會使你的例子看起來像這樣:

lock_t x = NULL __attribute__((cleanup(unlock)));
lock(&x);

當變量超出范圍時,將使用指向變量的指針調用unlock 它與其他語言功能(如returngoto )集成,甚至在混合C / C ++項目中也有例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM