【发布时间】:2014-05-09 05:25:55
【问题描述】:
我注意到 C11 不再允许您在循环构造中声明迭代器变量,例如,以下内容无效:
for (int i = 0; i < 10; ++i)
但这没关系:
int i;
for (i = 0; i < 10; ++i)
考虑到在 C99 之前甚至不可能在函数开头声明变量(块?Does C11 allow variable declarations at any place in a function?),我很好奇这与安全实践有何关系。迭代器应该声明在它们出现的函数或块的顶部,还是就在它们使用的第一个循环之上?我看不出这两种方式都有很大的不同,但前一种方法似乎更适合移动代码。就安全而言,我没有看到任何明显的影响。
另外,C11 发生上述变化的原因是什么?我更喜欢第一个示例中的语法。
编辑:对于我的最后一个问题,我想一个问题是,如果迭代器被多次使用,在一个块内移动 for (int i = 0; ... 将不会那么容易重构。
【问题讨论】:
-
您在使用
gcc -std=c11。如果您只使用gcc并且不指定标准,则默认为gnu89,这不允许在 for 循环内声明。在 ANSI C、C89 中是这样的,但限制与“混合声明和代码”一起被删除 -
我明白了,我没有使用那个选项。
-
我以为我至少在使用 c99,因为我可以使用 stdbool.h。
-
您必须为此指定
-std=c99。通常,您应该指定 C 标准,因为如果不这样做,您将使用所有 gnu 扩展,从而限制了代码的可移植性。我不记得gnu89支持哪些c99,但这足以引起问题。 -
更多here
标签: c coding-style declaration c11