私はwith-constructに似るマクロを探していました。これは、いくつかの他の目的のために役に立つかもしれない"with with macro" 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つのネストされたループがあります
- 初期化ループカウンタを(
with (int fd=open(..), close(fd))
など) - コードブロック内に
break
を許可します。
私はXV6のOSのコードでそれを使用し、それは非常に有用と思われる(continue
も許可されている。そして、マクロがassert()
にそれを調整することができます)。
私の質問です - このようなマクロの最悪の問題は何ですか?つまり、Cマクロ(単なる新しい制御フロー構築を実装したマクロ)の単なる使用に加えて、
は、これまでのところ、これらの欠点/問題を発見した:
return
またはgoto
(例えばfd < 0
など)のエラーの- はサポートされていません(それはカーネルコード内のいくつか
goto
Sを保存することができます)のサポートはありません。私はこれが修正可能だと思います。 - gnu89/c99以上(ループカウンタ。独自の変数のトリックは必要ありません)
- 単純なロックの解除よりも多少効率が悪いです。私はそれが重要ではないと信じています。
その他の問題はありますか? Cで同様の構文を実装するより良い方法はありますか?
ああ。最後に応答...ありがとう、私は 'クリーンアップ'について知りませんでした - 有用な音。そのマクロは、その奇妙さの他に、より具体的な問題を持っていますか? – Elazar
関数の途中で 'return'ステートメントに対して厳密なコーディング標準で作業しているのでなければ、' return'のサポートが不足しているように見えます。 'with'ブロックの' return'は目立たないように見えますが、実行時に大混乱を招きます。 – pdw
私は理解し、 'return'が大きな問題であることに同意します(' cleanup'ははるかに優れています)。しかし、「goto」は厳密な厳密なコーディング基準を必要としないのですか?この点で、gotoの利点は何ですか? – Elazar