变量定义,并且在同一时间分配
-
13-09-2019 - |
题
这是我在办公室最近参加了一个编码风格呈现主张变量不应被分配(为缺省值)在定义时。相反,他们应该只是他们在使用前分配的默认值。 所以,像
int a = 0;
应该在此皱眉。
显然,“INT”的例子是简单的,但相同的如下的其它类型也一样指针等
此外,也有人提到,C99兼容的编译器现在处于上述情况呕吐警告。
以上方法只为你只使用前memset的这些结构,即看起来对我来说非常有用。如果使用该结构(或填充)仅在误差腿,这将是有效的。
对于所有其他情况,我发现定义和我也遇到了很多,因为未初始化指针错误的分配到默认值的审慎演习都在编写和维护的代码。此外,相信C ++通过构造还主张相同的方法,即定义和分配。
我想知道为什么(如果)C99标准不喜欢定义&分配。是他们在做编码风格呈现提倡任何东西很大的优点?
解决方案
通常我会建议初始化变量时,他们是否应该有值是已知的定义,并留下未初始化的变量,如果该值不是。无论哪种方式,把它们尽可能接近它们作为作用域规则允许的。
相反,它们应被刚好在使用之前分配一个默认值。
通常你不应该使用一个默认值都没有。在C99,你可以混合代码和声明,所以没有点定义变量分配一个值之前。如果你知道它是应该采取的价值,再有就是在具有默认值是没有意义的。
此外,也有人提到,C99兼容的编译器现在处于上述情况呕吐警告。
不是你展示的情况下 - 你没有得到具有int x = 0;
警告。我强烈怀疑有人得到这个混合起来。编译器警告如果使用的变量,而不给其分配的值,并且如果你有:
... some code ...
int x;
if ( a )
x = 1;
else if ( b )
x = 2;
// oops, forgot the last case else x = 3;
return x * y;
,那么你将得到的是在不被初始化,至少用gcc使用X警告。
如果您分配一个值x
之前if
你不会得到一个警告,但它是无关紧要的分配是否为初始化器或作为一个单独的语句来完成的。
除非你有特别的理由两次赋值为两个分支,有没有点分配默认值X首先,因为它会停在编译器警告你,你已经覆盖每一个分支。
其他提示
还有的没有的这种要求(甚至准则,我所知道的)在C99,也没有编译器警告你一下吧。它只是一个风格问题。
至于编码风格而言,我觉得你拿了东西,望文生义。例如,你的说法是正确的下列情况下...
int i = 0;
for (; i < n; i++)
do_something(i);
...甚至在...
int i = 1;
[some code follows here]
while (i < a)
do_something(i);
...但也有另一些情况下,在我的脑海里,更好地与早期“申报,并指定”处理。考虑在叠层或各种OOP构建体构建的结构,如:
struct foo {
int bar;
void *private;
};
int my_callback(struct foo *foo)
{
struct my_struct *my_struct = foo->private;
[do something with my_struct]
return 0;
}
或者像在(C99结构初始化):
void do_something(int a, int b, int c)
{
struct foo foo = {
.a = a,
.b = b + 1,
.c = c / 2,
};
write_foo(&foo);
}
我的建议排序的同意,即使我并不完全确定标准说这事,我很怀疑有关编译器警告位为真。
事情是,现代的编译器可以做检测使用未初始化的变量。如果您设置的变量在初始化的默认值,你失去的检测。和默认值可能会导致错误太多;当然在你的榜样,int a = 0;
的情况。谁说0
为a
适当的值?
在上世纪90年代,该意见将已经错了。如今,它是正确的。
我找到代码它是非常有用的,以预先分配一些默认数据变量,这样我不必做(如许多)null检查。
我看到由于未初始化的指针,我总是主张申报与NULL_PTR每个变量这么多的错误,并且每个primitivewith一些无效/默认值。
由于我对RTOS和高性能,但低资源系统的工作,有可能是我们使用的编译器不赶未初始化的使用。虽然我怀疑现代编译器也可以在100%的被依赖
在宏的被广泛使用的大项目,我所看到的,甚至Kloclwork /净化并没有发现未初始化的使用罕见的场景。
所以我说坚持下去,只要你使用普通的旧的C / C ++。
像的.Net现代语言可以保证初始化varaibles,或给予一个编译错误用于未初始化的变量的使用。下面的链接做了性能分析和验证,有10-20%的性能命中.NET。该分析是在相当的细节和说明以及
http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx