在 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循环中声明一种以上类型的变量的方法?(这对宏很有用。)
编辑:
既然人们问为什么这很有用,我将粘贴一些示例代码:
#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 循环中声明匿名结构,尽管我必须使宏的使用不那么直观。我无法将声明外包给树的其余部分,因为它使用可变长度数组。