在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
永远不会返回的值。
它用于确保永远不会多次调用此函数。
答案 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。 所以下次没有执行初始化代码。