代码之家  ›  专栏  ›  技术社区  ›  Charles Eli Cheese

检测静态初始化阶段?

  •  0
  • Charles Eli Cheese  · 技术社区  · 15 年前

    我真正想要的是,我如何知道C++初始化的每一个阶段是什么时候真正完成的?

    在静态初始化中,简单的事情被分配。然后是动态静态初始化,其中分配了更复杂的静态,而不是跨“翻译单元”定义的。这有点可怕,没有很多简单的方法来应付。我在places中使用名称空间来进行加载头文件时发生的立即赋值,但这里的缺陷是,这可能会在初始化阶段之一被覆盖。

    我可以将初始化设置为一个做“正确的事情”的函数,但是如果我知道自己处于什么“阶段”会容易得多。据我所知,这是不可能的,但我希望有人会有一些好消息。

    我已经解决了这个问题,这是没有使用的代码被意外链接,因为它在项目中。知道这个问题的答案还是不错的,但我猜答案是“没有办法确定”。

    我编辑了这个问题,我真的不想知道主要是启动本身。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Remo.D    15 年前

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

    如果您正在谈论用自己的代码替换此代码,那么应该检查编译器/链接器的内部详细信息(并且确保您知道自己在做什么!!)。

    如果您的问题是关于拥有多个进程,并且您需要知道其中一个进程是否已启动,那么您应该使用适当的同步机制(可以是底层操作系统提供的同步机制之一,也可以是您自己创建的同步机制)。

        2
  •  1
  •   catwalk    15 年前

    bool is_started(bool set_started=false){
      static bool flag = false;
      if(set_started)
         flag=true;
      return flag;
    }
    
    main(){
      is_started(true);
    }
    
        3
  •  0
  •   Toad    15 年前

    如果您的问题是关于windows的,我知道您可以从进程启动时检测到消息泵。这样你就可以确定一切都初始化了。

    当然,这不是飞来飞去的

        4
  •  0
  •   Andrew Keith    15 年前

    如果您在windows上运行,请创建 mutex 在你完成初始化之后。然后可以在互斥体上等待singleobject,以检测程序是否真正初始化。

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