在编译期间将静态局部变量初始化为未知值

时间:2014-07-13 08:59:16

标签: c++ c compilation static-variables

在C语言中,为了在编译期间将静态局部变量初始化为未知值,我通常会做这样的事情(例如):

void func()
{
    static int var = INVALID_VALUE;
    if (var == INVALID_VALUE)
        var = some_other_func();
    ...
}

在C ++语言中,我可以做到:

void func()
{
    static int i = some_other_func();
    ...
}

C ++编译器正确解析它的唯一方法(我能想到)是用类似于上面C语言的机制替换此代码。

但编译器如何确定"正确的"无效值?还是有其他方式我没有考虑过吗?

由于


澄清:

INVALID_VALUE是函数some_other_func永远不会返回的值。

它用于确保永远不会多次调用此函数。

2 个答案:

答案 0 :(得分:2)

编译器不会根据其值生成代码,而是生成一个线程安全标志,以确保代码只执行一次。

类似的东西:

void func()
{
    static int i;
    static bool i_initialized;
    if (!i_initialized) {
      i = some_other_func();
      i_initialized = true;
    }
}

除了通常它不是一个bool而是一个线程安全的测试方法。

答案 1 :(得分:1)

根据通过反汇编和调试g ++编译代码看到的代码,有一个隐藏变量初始化为0,当初始化运行时,它被设置为1。 所以下次没有执行初始化代码。