在C11中放置迭代器声明(编码风格)

时间:2014-05-09 05:25:56

标签: c coding-style declaration c11

我注意到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; ...就不那么容易重构了。

2 个答案:

答案 0 :(得分:5)

你从哪里得到这个想法?

C11 draft,第6.8.5(1)节说:

  

迭代语句

     

while 表达式声明

     

执行 声明 表达);

     

表达式 opt ; 表达式 opt ; 表达式 opt 声明

     

声明 表达式 opt ; 表达式 opt 声明

最后一个表格清楚地表明在for语句的第一个子句中仍然允许声明。

[更新]

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

[更新2]

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

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

for (int i = 0 ; i < 10 ; ++i)
...

...然后我知道在循环终止后你并不依赖于i的值,因为它不再在范围内。

如果我看到:

int i;
for (i = 0 ; i < 10 ; ++i)
...

...然后我希望您稍后使用i的值;例如也许你早点break并且想知道发生这种情况时i是什么。如果我以后没有看到你使用i,我可能会想知道你在想什么和/或我错过了什么。

与往常一样,可读性是最重要的指标。当然,什么是合格的&#34;可读&#34;是一个意见问题。

答案 1 :(得分:2)

根据你链接的问题,C11应该仍然允许你在for循环中声明变量(为什么它们会像往常一样破坏向后兼容性?)。

在任何情况下,如果您正在编译C89(Microsoft编译器支持的C标准),那么您只能在块的开头声明新变量(即:在大括号之后)。好消息是你可以放置一个新的块,而不仅仅是在函数的顶部,这样你就可以通过将它包装在一组额外的花括号内来模拟C99 for-loop范围:

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