变量在未命名的命名空间中自动初始化为0?

时间:2011-06-29 19:56:26

标签: c++ namespaces initialization

我的理解是静态变量放在二进制文件的未初始化变量部分(BSS部分)中,因此可以假设它们被初始化为0。

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

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

不要依赖于为您初始化/完成的事情。只是做一下初始化,因为事情可能会发生变化而且你会被发现不知不觉。

答案 2 :(得分:1)

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