如果在静态全局初始化期间调用函数,则块函数/失败

时间:2012-03-13 18:11:37

标签: c++ gcc

无论如何,如果在全局静态变量初始化期间调用,我会导致函数失败吗?该函数使用另一个全局静态(来自不同的单元),因此在启动期间调用是不安全的。

我有两个原因。首先,如果我可以以某种方式检测到这种情况,我可以打印一个有用的调试消息,而不是从它有一个段错误和古怪的堆栈跟踪否则失败。其次,我可以防止它意外工作。有时库和目标文件只是排列正确,依赖顺序很好,因此您认为代码是正确的,但事实并非如此。

注意:这不是一个单独的程序,而是一个libary函数,因此标记一些全局变量作为主的第一步可能不是一个可行的选项。更糟糕的是,在一种情况下,它实际上是一个模板函数,引用了一个extern静态。

注意:出于效率的原因,我希望避免在函数调用中仅包装静态的明显解决方案。

允许使用GCC技巧,因为在我们的某个平台上检测到这一点就足够了。

1 个答案:

答案 0 :(得分:0)

也许是这样的:

#include <iostream>

bool& init()
{
    static bool inited=false;
    return inited;
}

class A
{
public:

    A()
    {
        if (! init())
        {
            std::cout<<"fail"<<std::endl;
        }
        else
        {
            std::cout<<"ok"<<std::endl;
        }
    }

};

A a1;

int main()
{
    init() = true;
    A a2;
}

这将导致全局初始化失败,并传递给main()创建。


上面看起来不太好,但没有其他方法,因为(正如你在问题中所说的那样)标准不保证在进入main之前对象的初始化顺序。唯一的建议是在开始main()之前避免创建对象。