gpt4 book ai didi

c - for循环声明匿名结构,clang编译失败

转载 作者:太空狗 更新时间:2023-10-29 17:00:43 25 4
gpt4 key购买 nike

在带有 -std=c99/gnu99 的 gcc 中,在 for 循环中声明匿名结构的代码工作正常

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 循环中声明匿名结构是不允许的,尽管我必须使宏使用起来不那么直观。我不可能将声明外包给树的其余部分,因为它使用可变长度数组。

最佳答案

恭敬地,我对之前的回答不以为然。它可以使用 gcc(使用 -Wall -pedantic)成功构建,但不能使用 clang 或 Visual Studio。

Microsoft 已将此 Microsoft Connect bug item 中与 Visual Studio 极为相似的问题视为错误.

6.8.5 表示 for-init-expression 中的标识符声明不能是 typedefexternstatic (除 autoregister 之外的唯一存储类说明符)。

C99 中的存储类说明符auto 是默认的并且是隐式的。结构类型和标识符 i 然后是自动的(在该代码块内具有范围)。那么代码肯定有效吗?我不明白 6.8.5 是如何禁止类型声明的。

我建议 gcc 是正确的,它是 clang 和 Visual Studio 实现的一个错误。

关于c - for循环声明匿名结构,clang编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11903232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com