我的假设是,这将使检查程序和堆栈分析变得混乱。 我无法证明自己的假设,并且我认为C99不会抱怨。 c89可能都不会,因为定义是在花括号打开后立即进行的:
if(true == condition){
int i = 0;
/* do stuff with i */
}else{
foo():
}
这两个路径将导致不同的堆栈使用情况。 在if / else语句之外声明i会导致更定义的堆栈用法(好吧,我分支到foo,因此在两种情况下堆栈将不完全相同)。 但是Misra建议限制最接近其用法的变量范围。
我是不是想得太多,还是在我的假设中有一个合理的依据?
答案 0 :(得分:6)
在c的if语句中声明变量是否有坏习惯?
否。
现代的方法是最大程度地减少使用的变量的范围,从而避免逻辑(难以修复)和语法(易于修复)错误。
当然,有些人仍然喜欢查看代码最顶部定义的所有变量,因为正如@Clifford所说,这是过去的惯例。
顺便说一句,您的代码应该可以使用C89和C99正常编译。
这种堆栈用法思想是过度思考的结果,我建议您遵循古希腊语短语:Métronáriston。
答案 1 :(得分:5)
该代码在任何C版本中都可以使用(C90不支持true
除外)。
这两个路径将导致不同的堆栈使用情况。
这主要是一个神话。现代编译器如果可以确定是否需要该变量,则可以堆叠该变量,而不管放置声明的位置如何。
如果变量是在寄存器中分配的,则仅当程序采用您的示例声明该变量的路径时才分配该变量。这不是因为声明的位置,而是因为将执行该路径。同样,出于性能考虑,声明变量的位置无关紧要,只要它在本地作用域而不是文件作用域中即可。
优良作法是尽可能限制变量的范围。但这是为了避免意外的错误和名称空间冲突。
但是Misra建议限制最接近其用法的变量范围。
不,不是,但是除了MISRA要求之外,某些静态分析仪还要求您这样做。 MISRA-C:2004 8.7和MISRA-C:2012 8.9都仅要求您将变量放在块范围内(如果该变量仅由一个功能使用)。就是这样。
MISRA却说:
在函数中,对象的定义是在最外层还是最内层很大程度上取决于样式