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

问题描述 投票:0回答:2

我知道 C99 之前的编译器需要在函数开头声明变量来计算堆栈大小。然后要求就被取消了。如今,除了向后兼容性之外,仍然坚持该方案是否有任何好处,或者也许仅在需要变量时以及在更需要变量的地方才声明变量? (例如,在 if 语句中,其中一个分支需要变量,但第二个分支不需要)

c c99
2个回答
9
投票

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

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

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


-1
投票

C 语言至少从 1978 年起就允许在任何语句块中声明变量,如C 编程语言第 4.8 节块结构中所述。 在 C 中可以和不能声明新变量?中也对此进行了描述。

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

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

  • 更简单的函数可能无法从变量声明结构的额外设计工作中受益,
  • 具有局部作用域变量的函数可以默默地隐藏更高级别的声明,
  • 包含动态大小调整的自动变量声明需要在分配之前进行检查,
  • 代码的读者可以在一个位置看到函数中引用的标识符 - 通常带有描述行为的注释,并且,
  • 从其他语言翻译而来的没有此功能的代码看起来更像原始代码。

相反,我可以想到这没有好处的几个原因:

  • 天真的编译器可以使用此信息来改进堆栈帧分配,而无需静态分析(特别是对于大变量),
  • 机械代码生成器可以通过在较小范围内声明变量而不进行检查来避免名称空间冲突,并且,
  • 长函数受益于局部作用域,避免潜在使用在整个函数体中无效的值。
© www.soinside.com 2019 - 2024. All rights reserved.