for ループで匿名構造体を宣言するコードは、-std=c99/gnu99 を使用して gcc で正常に機能しました
for (struct {int foo; int bar;} i = {0}; i.foo < 10; i.foo++);
ただし、代わりにclangに切り替えると、エラーが発生しました:
error: declaration of non-local variable in 'for' loop
なぜこれがエラーになるのですか?一部の型 (例: "int") を許可し、他の型 (例: struct {int foo;}) を許可しないのはなぜですか? これは矛盾しているようです。clang は c99 を正しく実装できませんか、それともそのコードは無効な c99 であり、gcc はたまたまそれをサポートしていますか?
clang でサポートされている for ループで複数の型の変数を宣言する方法を知っている人はいますか? (これはマクロに役立ちます。)
編集:
これが便利な理由を尋ねられたので、いくつかのサンプル コードを貼り付けます。
#define TREE_EACH(head, node, field, iterator) for ( \
/* initialize */ \
struct { \
node* cur; \
node* stack[((head)->th_root == 0? 0: (head)->th_root->field.avl_height) + 1]; \
uint32_t stack_size; \
} iterator = {.cur = (head)->th_root, .stack_size = 0}; \
/* while */ \
iterator.cur != 0; \
/* iterate */ \
(iterator.stack_size += (iterator.cur->field.avl_right != 0) \
? (iterator.stack[iterator.stack_size] = avl_right, 1) \
: 0), \
(iterator.cur = (iterator.cur->field.avl_left == 0) \
? iterator.cur->field.avl_left \
: (iterator.stack_size > 0? (iterator.stack_size--, iterator.stack[iterator.stack_size]): 0)) \
)
これは私が書いた非常に便利なマクロで、スタック上で AVL ツリーを深さ優先で反復処理します。for ループで匿名の構造体を宣言することは許可されていないため、マクロを直感的に使用しにくくする必要があります。可変長配列を使用しているため、ツリーの残りの部分に宣言をアウトソーシングすることはできませんでした。