在 for 循环中声明匿名结构的代码在 gcc 中使用 -std=c99/gnu99 工作得很好
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 循环中声明多种类型变量的方法吗? (这对于宏很有用。)
EDIT:
既然人们问为什么这有用,我将粘贴一些示例代码:
#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 循环中声明匿名结构,因此我必须使宏使用起来不太直观。我不可能将声明外包给树的其余部分,因为它使用可变长度数组。