无论如何,如果在全局静态变量初始化期间调用,我会导致函数失败吗?该函数使用另一个全局静态(来自不同的单元),因此在启动期间调用是不安全的。
我有两个原因。首先,如果我可以以某种方式检测到这种情况,我可以打印一个有用的调试消息,而不是从它有一个段错误和古怪的堆栈跟踪否则失败。其次,我可以防止它意外工作。有时库和目标文件只是排列正确,依赖顺序很好,因此您认为代码是正确的,但事实并非如此。
注意:这不是一个单独的程序,而是一个libary函数,因此标记一些全局变量作为主的第一步可能不是一个可行的选项。更糟糕的是,在一种情况下,它实际上是一个模板函数,引用了一个extern静态。
注意:出于效率的原因,我希望避免在函数调用中仅包装静态的明显解决方案。
允许使用GCC技巧,因为在我们的某个平台上检测到这一点就足够了。
答案 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()
之前避免创建对象。