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
orはサポートされていません(ただし、カーネルコードでgoto
いくつかの s を節約できます)goto
- エラー ( など
fd < 0
) はサポートされていません。これは修正可能だと思います。 - gnu89 / c99以降のみ(ループカウンター。独自変数トリックは不要)
- 単純なロックとロック解除よりも効率がやや劣ります。私はそれが重要ではないと信じています。
他に問題はありますか?Cで同様の構造を実装するより良い方法はありますか?