我知道 C99 之前的编译器需要在函数开头声明变量来计算堆栈大小。然后要求就被取消了。如今,除了向后兼容性之外,仍然坚持该方案是否有任何好处,或者也许仅在需要变量时以及在更需要变量的地方才声明变量? (例如,在 if 语句中,其中一个分支需要变量,但第二个分支不需要)
答案是否定的。在函数开头声明标识符不会带来编译或其他计算方面的好处。
优秀的现代编译器会分析代码中使用值的位置,因此只要不影响语义(例如将声明移动到复合语句中,缩小其范围),声明的位置就无关紧要。
在某些情况下,在函数或块的开头告诉人类读者你要做什么可能会有好处。一般来说,在需要的地方声明标识符是有益的,因为这往往会减少读者一次必须考虑的事情的数量。但是,如果函数要执行的算法有某种模式或韵律和原因,那么在开始时展示其某些方面可以帮助读者理解它。
C 语言至少从 1978 年起就允许在任何语句块中声明变量,如C 编程语言第 4.8 节块结构中所述。 在 C 中可以和不能声明新变量?中也对此进行了描述。
最近的修订,除了允许在任何块的开头进行声明之外,还允许将声明放置在块的后面,但不允许前向引用。数组的大小也可以动态定义,并且不限于常量表达式。
是否有任何好处则涉及到谁的问题。我能想到有好处的原因:
相反,我可以想到这没有好处的几个原因: