编码标准:变量初始化

时间:2014-05-21 20:15:50

标签: c gcc

某些编码标准要求在声明它时初始化每个变量,即使该值没有意义且变量很快就会被写入。

例如:

main()
{
   char rx_char;
   :
   :
   rx_char = get_char();

}

我的同事要求我初始化rx_char,但我不明白为什么。有人能指出原因吗?

4 个答案:

答案 0 :(得分:5)

“在声明它时初始化每个变量,即使该值无意义”也是货物崇拜行为的教科书示例。这是一个完全没有意义的要求,应尽可能避免。在许多情况下,无意义的初始化器并不比随机的未初始化值好多少。在它实际上可以“拯救一天”的情况下,它通过在地毯下扫除问题,即通过隐藏来实现。隐藏的问题总是最糟糕的。当代码中存在问题时,最好让它尽可能快地显示自己,即使代码崩溃或行为不正常。

此外,此类要求可能会通过向编译器发送有关与变量关联的有效值生命周期的误导信息来阻止编译器优化。优化器可以将未初始化的变量视为不存在,从而节省宝贵的资源(例如CPU寄存器)。为了获得关于用无意义值初始化的变量的相同类型的知识,优化器必须能够确定它确实无意义,这通常是更复杂的任务。

同样的问题必须由阅读代码的人解决,这会妨碍可读性。不熟悉代码的人不能立即说出具体的初始化程序是否有意义(即下面的代码依赖于初始值)或无意义(即由上述货物崇拜者的追随者无意义地提供)。

值得注意的是,一些现代编译器可以检测在编译时和运行时使用未初始化变量值的尝试。当检测到此类尝试时,此类编译器会发出编译时警告或运行时断言(在调试版本中)。根据我的经验,这个功能比初看起来更有用。同时,无意义地初始化具有无意义值的变量打败此编译器提供的安全功能,并再次隐藏相关错误。从这个角度来看,这当然弊大于利。

幸运的是,问题不再像过去那样严重。在现代版本的C语言中,变量可以在代码中的任何地方声明,从而显着降低了这种编码标准的有害影响。您不再需要在块的开头声明变量,这大大增加了当您准备声明变量时,您还准备为其提供有意义的初始化程序的机会。 / p>

初始化器很好。但是当您发现无法为变量提供有意义的初始值设定项时,尝试重新组织代码以便为有意义的初始化程序创建机会总是更好的主意,而不是放弃和只是使用一个毫无意义的。即使在C99之前的代码中,这通常也是可能的。

答案 1 :(得分:2)

现代编译器通常会对使用未初始化的变量发出警告,我不赞成不对某些虚假值进行初始化。然后,如果有人在初始化之前意外地使用了变量,您将收到警告,而不是花费X时间调试并找出错误。

答案 2 :(得分:0)

初始化变量是一种很好的做法,即使它只是将它们设置为类型" null"当量。如果其他人出现并希望编辑该代码,并在您初始化之前使用rx_char,则会产生非确定性行为。 rx_char的值取决于您控件之外的内容。有些编译器0初始化变量,但你不应该依赖它!

通过在声明中初始化它,您可以保证确定性行为。这通常比调整更容易,而rx_char是完全随机的,如果你把它保持未初始化的话,可能就是这样。

main() {
    char rx_char;
    //Some stuff
    char your_coworkers_char = rx_char;
    //Some other stuff
    rx_char = get_char();
    putchar(your_cowowarers_char); //Potentially prints randomness!
}

这可能是最佳选择,除非你使用超级旧式编译器,否则你应该没问题。

main() {
    //some stuff
    char rx_char = get_char();
    putchar(your_cowowarers_char); //Potentially prints randomness!
}

答案 3 :(得分:-1)

  

任何人都可以指出原因吗?

你应该问的第一个人是要求你这样做的同事。她的理由可能与我们提出的理由完全不同。

...

大多数编码标准都与未来一样,关乎今天发生的事情。

今天,是的,如果您有char rx_charchar rx_char = 0,则没有任何区别。但是在将来,如果有人删除了rx_char=getchar()行,会发生什么?然后rx_char是一个随机的,未初始化的值。如果rx_char为0,那么你仍然会有一个bug,但它不是随机的。