5

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 OS のコードで使用しましたが、非常に便利です。

私の質問は - そのようなマクロの最悪の問題は何ですか? つまり、C マクロ (特に、新しい制御フロー構造を実装するもの) を単に使用する以外に。

これまでのところ、これらの欠点/問題が見つかりました:

  1. returnorはサポートされていません(ただし、カーネルコードでgotoいくつかの s を節約できます)goto
  2. エラー ( などfd < 0) はサポートされていません。これは修正可能だと思います。
  3. gnu89 / c99以降のみ(ループカウンター。独自変数トリックは不要)
  4. 単純なロックとロック解除よりも効率がやや劣ります。私はそれが重要ではないと信じています。

他に問題はありますか?Cで同様の構造を実装するより良い方法はありますか?

4

1 に答える 1

6
于 2013-04-28T11:35:00.370 に答える