c - 始终初始化所有变量

标签 c coding-style

我正在阅读 the FreeBSD coding style并且非常喜欢它(因为我喜欢垂直紧凑的代码)。但是有这个:

Initialize all Variables
You shall always initialize variables. Always. Every time. gcc with the flag -W may catch operations on uninitialized variables, but it may also not.

Justification
More problems than you can believe are eventually traced back to a pointer or variable left uninitialized.

当变量没有合适的初始值时,让它没有值不是更好吗?这样编译器可能会捕捉到未初始化的读取。我不是在谈论 T *p = NULL,它是一个陷阱表示,可能(或可能不会)非常有用,而是 int personal_number = 0/* 但 0 是有效的个人号码!!*/


澄清一下,作为对 abasu 评论的回应,我的示例试图说明没有可用无效值的情况。我问了question并回答说使用不可能的值来标记错误或其他条件很棒。但情况并非总是如此。例子很多:8bit 像素值、速度 vector 等。


我可以看到“始终初始化变量”的一个有效替代方法是:

//logical place for declarations
T a;

/*code, for example to set up the environment for evaluating a*/

a = fooForA();

/*more code*/

fooThatUsesA(a);

这样如果忘记初始化,会有警告,bug会被修复,去掉警告。

最佳答案

所有整数都是有效的个人号码吗?

如果不是,则使用无效值初始化personal_number

如果它们是,那么即使您没有自己初始化 personal_number 它仍然拥有一个有效的个人号码值 -- 但该值是未知的。因此,无论如何将它初始化为 0——您没有引入问题(之前的有效数字,之后的有效数字),唯一的区别是您现在知道该数字。

当然,在这两种情况下,最好不要使用整数文字进行初始化,而是做这样的事情:

enum { INVALID_PERSONAL_NUMBER = -1 }

int personal_number = INVALID_PERSONAL_NUMBER;

关于c - 始终初始化所有变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478932/

相关文章:

haskell - `where` 子句在 Haskell 中在哪里派上用场

c - 是否调整您的 (u)ints 大小?

php - 包含内部函数被认为是不好的做法吗?

c - 如何优化C非阻塞accept()套接字连接

c - GNU Make --output-sync 不起作用?

c - 带有 GMP 库的斐波那契数列

c - 在 C 中获取主机名

c - 嵌套函数指针声明

javascript - 另一种写代码的方法

c - 为什么 c block 总是在 ^ 之后直接有 { 而不是在新行上,有什么原因吗?