2009-11-19 102 views
0

我真正想要的是,我怎么知道每个C++初始化阶段何时真正完成?检测静态初始化阶段?

有简单的东西被分配的静态初始化。然后是动态静态初始化,其中更复杂的静态分配被赋予,这不是跨'翻译单位'定义的。这太可怕了,并且没有很多简单的方法可以应付。我在地方使用名称空间来做加载头文件时发生的立即分配,但是这里的缺陷是,这可能会在其中一个初始化阶段被覆盖。

我可以设置初始化为它做“正确的事”的功能,但它会容易得多,如果我能知道我在某种程度上是什么“的阶段”。据我所知,这是不可能的,但我希望在那里有人会有一些好消息。

我已经解决了导致这个问题的问题,这是代码没有被意外地链接,因为它在项目中。知道这个答案仍然很好,但我猜测答案是'没有办法知道肯定'。

我编辑的问题,我真的不想知道主要是本身开始。

+5

我认为如果你正在根据你的设计是否已经开始你正在吠叫错误的树。听起来好像你正在创建一个脆弱的框架,如果你说在多线程环境中使用它,以后可能会有技术上的困难。 – 2009-11-19 08:54:46

+1

你需要什么?我从来没有见过这种情况会有用。你可以重新设计,让问题消失吗? – Thomas 2009-11-19 08:56:20

+0

它不只是看到main是否启动,当然如果我在main调用某个东西,main就开始了。我想知道的原因是,在初始化运行时知道我处于什么阶段会很高兴。 – 2009-12-03 04:24:08

回答

1

怎么是这样的:

bool is_started(bool set_started=false){ 
    static bool flag = false; 
    if(set_started) 
    flag=true; 
    return flag; 
} 

main(){ 
    is_started(true); 
} 
0

如果你的问题是有关Windows,我知道你可以检测来自一个过程messagepump已经开始。这样你肯定知道一切都已经初始化了。

当然这不适用于* nix

+0

或用于控制台应用程序。 – 2009-11-19 10:43:20

3

我不明白你想解决什么问题。

当你建立你的应用程序,链接器添加了启动代码,当操作系统在内存中加载程序来执行的第一个代码。这段代码将完成所有初始化工作,完成后将调用main()函数。

如果你谈论的是用自己的替换这个代码,你应该检查你的编译器/连接器的内部细节(和非常肯定你知道你在做什么!)。

如果你的问题是关于有多个进程,并且你需要知道一个进程是否已经启动,你应该使用正确的同步机制(可以是底层操作系统提供的机制或你自己创建的机制之一) )。

+1

“初始化东西”包括调用构造函数和初始化全局对象所需的其他函数,所以在main()之前运行一些自己的代码是正常的。 – 2009-11-19 13:18:02

0

如果您在Windows上运行,创建初始化完成后,mutex。然后,您可以在该互斥量上使用WaitForSingleOject来检测程序是否真正初始化。

许多应用程序会这样做来检测启动是否完成以及应用程序的其他实例是什么。如果您只想运行一个程序的实例,则尤其如此。