关于范围的变量的最佳声明

jay*_*lee 8 c c++ scope coding-style

我主要就C编程问这个问题,但欢迎任何语言的见解.

谈到C,我知道它只允许变量声明在代码块的最开始发生.我一直认为应该在函数的最开始声明要在函数内使用的所有变量.但是在很多情况下我会有一个仅在循环(或类似的块)中使用的变量.

一个例子是一些返回值的临时变量:

while ( whatever ) {
  int ret;
  ret = getSomeValue();
}
Run Code Online (Sandbox Code Playgroud)

或者某些州可能需要举行的地方:

while ( whatever ) {
  static int count=0;
  count++;
}
Run Code Online (Sandbox Code Playgroud)

我想知道它是否被认为是不合适的,或者,如果在控制流程块中声明变量有任何负面影响,例如if-else,for循环,while循环等.

变量是否应始终以最严格的范围声明?静态声明怎么样?

编辑:好的,我可能应该说我知道C99在你声明变量的地方更自由,但是从我看到的很多C代码中,它们仍然通常被声明在顶部.另外,我使用的VS2K8仍然抱怨声明.

另外,看到我已经有2票可以关闭这个thead,我会明确表示我更关心性能和编译器方面,而不是任何风格.

Pau*_*aul 7

根据经验,变量应始终尽可能为局部变量.如果你能成功,可以获得奖励积分const.


Dig*_*oss 5

好吧,关于块顶部的声明的事情是C89和K&R,但是从C99开始,你可以混合声明和语句.这种风格持续存在,可能有充分的理由,但并不是必需的.

曾经有一段时间,如果你在使用它们的地方声明了很多局部变量,那么一些编译器会做得更好,因为它使寄存器分配更好.在C99之前,您必须在块的顶部声明它们或使用供应商扩展,但您仍然可以决定仅在本地代码区域中实际使用每个变量.

通过更灵活的声明放置直接支持这一点似乎很重要,但我怀疑这些天优化器不需要那种帮助.

一些编码标准要求在函数顶部声明.我不知道是不是这样你可以找到它们,或者它是否只是在没有这样做可能会限制向后移植性的日子里遗留下来的.

通常,标准越正式,它就越不喜欢交错语句和声明,除了循环控制变量.就个人而言,我没有看到它的问题.

混合声明的优点:局部性.对编译器有好处,对读者有好处.通过在函数顶部声明循环变量可以产生什么样的好处?在可能不需要的交互方面,在页面中重用变量以达到不相关的目的似乎令人困惑和不明智.

分组声明的优点:代码在主观方面看起来更干净,你知道在哪里找到每个声明,如果你的函数的顶部离变量的使用太远,也许这告诉你需要从明显过大的函数中提取第二个或第三个函数.