C 在函数开头声明变量有什么好处吗?

C 在函数开头声明变量有什么好处吗?,c,c99,C,C99,我知道C99之前的编译器需要在函数开始时声明变量来计算堆栈大小。然后取消了要求。如今,除了向后兼容之外,仍然坚持这个方案还有什么好处,或者仅仅在需要变量的时候声明变量,以及在需要更好的地方声明变量?(例如,在if语句中,一个分支需要变量,而另一个分支不需要)答案是否。在函数开头声明标识符不会带来编译或其他计算方面的好处 好的现代编译器分析代码中使用值的位置,因此声明的位置是无关的,只要它们不影响语义(例如将声明移动到复合语句中,缩小其范围) 在某些情况下,在函数或块的开头告诉读者您要做什么可能会

我知道C99之前的编译器需要在函数开始时声明变量来计算堆栈大小。然后取消了要求。如今,除了向后兼容之外,仍然坚持这个方案还有什么好处,或者仅仅在需要变量的时候声明变量,以及在需要更好的地方声明变量?(例如,在if语句中,一个分支需要变量,而另一个分支不需要)

答案是否。在函数开头声明标识符不会带来编译或其他计算方面的好处

好的现代编译器分析代码中使用值的位置,因此声明的位置是无关的,只要它们不影响语义(例如将声明移动到复合语句中,缩小其范围)


在某些情况下,在函数或块的开头告诉读者您要做什么可能会有好处。通常,在需要标识符的地方声明标识符是有益的,因为这会减少读者一次必须考虑的事情的数量。但是,如果函数将要执行的算法有某种模式或韵律以及原因,那么在开始时展示该算法的某些方面可以帮助读者理解它。

答案是否定的。在函数开始时声明标识符不会带来编译或其他计算方面的好处

好的现代编译器分析代码中使用值的位置,因此声明的位置是无关的,只要它们不影响语义(例如将声明移动到复合语句中,缩小其范围)


在某些情况下,在函数或块的开头告诉读者您要做什么可能会有好处。通常,在需要标识符的地方声明标识符是有益的,因为这会减少读者一次必须考虑的事情的数量。但是,如果函数将要执行的算法有某种模式或韵律和原因,那么在开始时展示该算法的某些方面可以帮助读者理解它。

C语言允许在任何语句块中声明至少从1978年开始的变量,如第4.8节块结构所述。这也在中进行了描述

最近的修订版除了允许在任何块的开头进行声明外,还允许稍后在块中放置声明,但不允许向前引用。数组的大小也可以动态定义,并且不限于常量表达式

是否有任何好处是谁的问题。我能想到有好处的原因:

  • 更简单的函数可能无法从构建变量声明的额外设计工作中获益
  • 具有局部作用域变量的函数可以在更高级别上隐藏声明
  • 自动变量声明,其中包含需要在分配前进行检查的动态大小调整
  • 代码读者可以在一个位置看到函数中引用的标识符,通常带有描述行为的注释,以及
  • 从其他语言翻译而来但没有此功能的代码看起来更像原始代码
相反地,我可以想出几个原因来说明这是没有好处的:

  • 天真的编译器可以使用这些信息来改进堆栈帧分配,而无需进行静态分析(特别是使用大变量)
  • mechanical代码生成器可以通过在较小范围内声明变量而避免名称空间冲突,并且
  • 长函数通过避免在整个函数体中使用无效的值而受益于局部作用域

如第4.8节“块结构”所述,至少从1978年起,C语言允许在任何语句块中声明变量。这也在中进行了描述

最近的修订版除了允许在任何块的开头进行声明外,还允许稍后在块中放置声明,但不允许向前引用。数组的大小也可以动态定义,并且不限于常量表达式

是否有任何好处是谁的问题。我能想到有好处的原因:

  • 更简单的函数可能无法从构建变量声明的额外设计工作中获益
  • 具有局部作用域变量的函数可以在更高级别上隐藏声明
  • 自动变量声明,其中包含需要在分配前进行检查的动态大小调整
  • 代码读者可以在一个位置看到函数中引用的标识符,通常带有描述行为的注释,以及
  • 从其他语言翻译而来但没有此功能的代码看起来更像原始代码
相反地,我可以想出几个原因来说明这是没有好处的:

  • 天真的编译器可以使用这些信息来改进堆栈帧分配,而无需进行静态分析(特别是使用大变量)
  • mechanical代码生成器可以通过在较小范围内声明变量而避免名称空间冲突,并且
  • 长函数通过避免在整个函数体中使用无效的值而受益于局部作用域

这感觉有点基于观点。也就是说,对于清洁度,我总是建议只从需要变量的角度声明变量。如果您只需要在单个块中使用变量,为什么要在该块之外声明它?@ThomasJager:有一些编码标准,其中MISRA是最常见的,不允许混合使用代码和声明。不过,我同意这一点过于宽泛,应该关闭。我认为你应该有足够的代表来结束投票