在C11中放置迭代器声明(编码样式)

在C11中放置迭代器声明(编码样式),c,coding-style,declaration,c11,C,Coding Style,Declaration,C11,我注意到C11不再允许您在循环构造中声明迭代器变量,例如,以下内容无效: for (int i = 0; i < 10; ++i) for(int i=0;i

我注意到C11不再允许您在循环构造中声明迭代器变量,例如,以下内容无效:

for (int i = 0; i < 10; ++i)
for(int i=0;i<10;++i)
但这没关系:

int i;
for (i = 0; i < 10; ++i)
inti;
对于(i=0;i<10;++i)
考虑到C99之前,除了在函数开头(block?)之外,甚至不可能声明变量,我很好奇这与安全实践有什么关系。迭代器应该在其所在的函数或块的顶部声明,还是在使用迭代器的第一个循环的正上方声明?我看不出这两种方法有多大区别,但前一种方法似乎对移动代码更具鲁棒性。就安全而言,我看不到任何明显的影响

此外,C11的上述变化的原因是什么?我相当喜欢第一个示例中的语法


编辑:对于我的最后一个问题,我想一个问题是,如果迭代器被多次使用,在块中移动
for(int I=0;…
将不那么容易重构。

根据您链接的问题,C11应该仍然允许您在for循环中声明变量(他们为什么要这样破坏向后兼容性?)

在任何情况下,如果您是根据C89(Microsoft编译器支持的C标准)进行编译,那么您只能在块的开头声明新变量(即:大括号后面)。好消息是,您可以在任意位置放置新的块,而不仅仅是在函数的顶部,这样您就可以通过将C99 for循环作用域包装在一组额外的花括号中来模拟它:

/* ... */
{int i; for(i=0; i<10; i++){
    /* ... */
}}
/* ... */
/**/

{int i;for(i=0;i根据您链接的问题,C11应该仍然允许您在for循环中声明变量(为什么它们会像那样破坏向后兼容性?)

在任何情况下,如果您是根据C89(Microsoft编译器支持的C标准)进行编译,那么您只能在块的开头声明新变量(即:大括号后面)。好消息是,您可以在任意位置放置新的块,而不仅仅是在函数的顶部,这样您就可以通过将C99 for循环作用域包装在一组额外的花括号中来模拟它:

/* ... */
{int i; for(i=0; i<10; i++){
    /* ... */
}}
/* ... */
/**/

{inti;for(i=0;i你从哪里得到这个主意的

第6.8.5(1)节规定:

迭代语句:

while(表达式)语句

do语句while(表达式)

用于(expressionopt;expressionopt;expressionopt)语句

对于(声明表达部分;表达部分)声明

最后一种形式非常清楚地表明,在
for
语句的第一个子句中仍然允许声明

[更新]

请注意,声明类似于
inti=0;
。也就是说,它包括分号(参见第6.7节)。因此,C11肯定允许
for(inti=0;i<10;++i)

[更新2]

至于何时使用哪个,这是一个意见问题。我的意见是,您应该尽可能嵌入声明,因为它使代码更易于阅读

如果我正在阅读您的代码,并且我看到:

for (int i = 0 ; i < 10 ; ++i)
...
…然后我希望您稍后使用
I
的值;例如,可能您
很早就中断了
,想知道发生这种情况时
I
是什么。如果我没有看到您稍后使用
I
,我可能会想知道您在想什么和/或我遗漏了什么


像往常一样,可读性是最重要的指标。当然,什么是“可读性”是一个意见问题。

你从哪里得到这个想法的

第6.8.5(1)节规定:

迭代语句:

while(表达式)语句

do语句while(表达式)

用于(expressionopt;expressionopt;expressionopt)语句

对于(声明表达部分;表达部分)声明

最后一种形式非常清楚地表明,在
for
语句的第一个子句中仍然允许声明

[更新]

请注意,声明类似于
inti=0;
。也就是说,它包括分号(参见第6.7节)。因此,C11肯定允许
for(inti=0;i<10;++i)

[更新2]

至于何时使用哪个,这是一个意见问题。我的意见是,您应该尽可能嵌入声明,因为它使代码更易于阅读

如果我正在阅读您的代码,并且我看到:

for (int i = 0 ; i < 10 ; ++i)
...
…然后我希望您稍后使用
I
的值;例如,可能您
很早就中断了
,想知道发生这种情况时
I
是什么。如果我没有看到您稍后使用
I
,我可能会想知道您在想什么和/或我遗漏了什么


像往常一样,可读性是最重要的指标。当然,“可读性”是一个意见问题。

整天都在工作,每天都在GCC和MSVC中。不过有一个需要注意的问题。i的范围在for{}仅循环。一如既往,在何处使用哪种形式需要一些判断。@bbarker:始终告诉gcc您要编译的C方言。请参阅注意:允许
声明表达式的形式也不允许
表达式-3
@david.pfx:我不这样认为……声明类似于
int I=0;
…也就是说,它包括分号。请参见附录A.2.2。@bbarker:该警告已过时。它应该是“C99或C11模式”。请尝试
gcc-std=C11…
全天工作,每天都在gcc和MSVC中。不过,需要注意一点。i的范围仅在for{}循环中。一如既往,在哪里使用它