2011-06-29 30 views
1

我的理解是静态变量放在二进制(BSS段)的未初始化的变量部分得到等等这些都是安全的假设为被初始化为0变量在未命名的命名空间中自动初始化为0?

但是我有一个无名命名空间中定义的函数。在函数内部,有一个char数组被声明为未明确初始化为0.这会被自动初始化为0吗?怎么样的变量没有声明为静态的,而是在未命名的命名空间中定义的?那么静态函数的局部变量呢?

回答

1

千万不要依赖于为你初始化/完成的事情。随着事情可能发生变化,只需进行初始化即可,并且您将不知情地被捕获。

1

你不能依赖一个变量被自动初始化为任何值。即使在某些情况下会不断发生这种情况,只要更改编译器就可以产生完全不同的结果。最安全的是始终初始化每个变量以确保其价值。您还应该初始化static variables。变量属于命名空间这一事实并不重要。

2

函数局部变量不会自动初始化为零,无论函数是匿名命名空间,静态还是其他。这是因为函数内部的局部变量不是静态变量。要使局部变量具有静态存储持续时间,您必须用static明确标记它。

int foo; // static storage duration (because it's global) automatically zero-initialized 

static int foo2; // static storage duration (because it's global) automatically zero-initialized. The static keyword just gives the name 'foo2' internal linkage and has nothing to do with static storage duration. 

namespace { 

    int foo; // static storage duration, automatically zero-initialized 

    void bar() { 
     int f; // local variable, not automatically zero-initialized 

     static int g; // static storage duration (because of the keyword static), automatically zero-initialized 
    } 
}