は、私はこのように動作しますイテレータのマクロを定義したい:このコードは有効ですか?互換性の理由から
elem_type *ptr;
ITERATE(&container, ptr) {
// This will loop through every element of the container
// ptr will point to the current element.
}
私は関数呼び出しで初期化する必要がありますイテレータ型を持っており、このように動作します:
iter_type iter;
iter_init(&container, &iter);
while((ptr = iter_next(&iter))) {
// ...
}
だから、これは私がマクロにこのシーケンスを圧迫する思い付いたソリューションです:あなたが見ることができるよう、
#define ITERATE(container_ptr,elem_ptr) \
for(iter_type _iter = (\
iter_init(container_ptr, &_iter), _iter); \
(elem_ptr = iter_next(&_iterator));)
そうで、ちょっとしたトリックワットがありますコンマ演算子を使用して、for
の最初のコロンに変数宣言と関数呼び出しの初期化の両方を適合させます。このコードは有効なC99ですか、常に動作しますか?
有効ですか?有効なものを定義する。コンパイルは最初のステップかもしれません。また、あなたはこのマクロを発明する最初の人ではありません。その共通のものです。 - Linuxカーネルを確認してください。 –
私の有効な定義は "とっても効果があります"。それが十分に明確でない場合は、「常に」という言い方をすれば、私はC99の苦情の実装をすべて意味していました。そして、私がこのマクロを探す場所を知らなかったら、私はこのマクロを発明した最初の人間ではないということは無関係です。最後に、ビルドオプションでC99スイッチが有効になっていないと、カーネルコードにどう対応できますか? – lvella
あなたが探している言葉は "ポータブル"です –