在c中的if语句中声明变量是否有坏习惯?

时间:2018-12-18 09:16:59

标签: c if-statement stack embedded misra

我的假设是,这将使检查程序和堆栈分析变得混乱。 我无法证明自己的假设,并且我认为C99不会抱怨。 c89可能都不会,因为定义是在花括号打开后立即进行的:

 if(true == condition){
       int i = 0; 
       /* do stuff with i */
 }else{ 
   foo():
 }

这两个路径将导致不同的堆栈使用情况。 在if / else语句之外声明i会导致更定义的堆栈用法(好吧,我分支到foo,因此在两种情况下堆栈将不完全相同)。 但是Misra建议限制最接近其用法的变量范围。

我是不是想得太多,还是在我的假设中有一个合理的依据?

2 个答案:

答案 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却说:

  

在函数中,对象的定义是在最外层还是最内层很大程度上取决于样式