【发布时间】:2013-05-10 09:19:00
【问题描述】:
我正在阅读the FreeBSD coding style 并且非常喜欢它(因为我喜欢垂直紧凑的代码)。但是有这样的:
初始化所有变量
您应始终初始化变量。总是。每次。带有标志 -W 的 gcc 可能会捕获对未初始化变量的操作,但是 也可能不会。理由
比你想象的更多的问题最终被追溯到未初始化的指针或变量。
当变量没有合适的初始值时,让它没有值不是更好吗?这样编译器可能会在未初始化的情况下读取它。我不是在谈论T *p = NULL,这是一个陷阱表示,可能(或可能不是)非常有用,而是int personal_number = 0 /* but 0 is a valid personal number!!*/
为了澄清,针对 abasu 的评论,我的示例试图说明没有可用无效值的情况。我问了question,得到的回答是使用不可能的值来标记错误或其他条件非常棒。但情况并非总是如此。例子很多:8bit像素值、速度向量等。
我可以看到“始终初始化变量”的一种有效替代方法是:
//logical place for declarations
T a;
/*code, for example to set up the environment for evaluating a*/
a = fooForA();
/*more code*/
fooThatUsesA(a);
这样如果忘记初始化,会出现警告并修复bug,消除警告。
【问题讨论】:
-
取决于什么是有意义的...
-1作为无效的personal_number怎么样? -
如果它也未初始化,这并不意味着不会有值。并且该值也可以是有效数字(偶然地,意外地)。那么你的选择是什么?当具有某些有效值的未初始化变量产生一些不需要的副作用时,让它走运并可能面临灾难?或者花大约 10 秒找出一个无效值,并确保你的变量是用它初始化的(当然你的程序正在检查它)
-
@abasu,我的意思是编译器或静态分析器很容易检测到未初始化的值。另一方面,将变量设置为 错误 有效 值可能会让程序员和机器感到困惑。
-
@Vorac 好的。编译器捕获它未初始化并给你一个警告。这很棒。 然后你会怎么做? “始终初始化变量”与利用该编译器警告并不矛盾。实际上,存在警告是因为您首先违反了规则。问题是您将如何解决该违规行为。或者您是否在代码中看到警告说您有未初始化的变量只是为了看到警告?如果您实际上不做一些事情,那是没有意义的。
-
@Vorac 是的,你的观点是有效的。 (虽然我不确定,编译器和静态分析器可以捕获 100% 的情况,为此,有运行时工具)但是第二行,
setting a variable to a wrong valid value这不是一个错误(即编码错误??)。如果是,那么会出现混乱。预期的不是问题,问题是出乎意料的。 :) :) (个人经验)
标签: c coding-style