检测静态初始化阶段?

时间:2009-11-19 08:43:51

标签: c++ static namespaces

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

静态初始化可以分配简单的事物。然后是动态静态初始化,其中分配了更复杂的静态,而不是在“翻译单元”中定义。这有点可怕,并没有很多简单的方法来应对。我在地方使用命名空间来进行加载头文件时发生的即时分配,但是这里的缺陷是它可以在其中一个初始化阶段被覆盖。

我可以将初始化设置为一个“做正确的事情”的功能,但如果我能知道某个“阶段”是什么话会更容易。据我所知,这根本不可能,但我希望有人会有一些好消息。

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

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

4 个答案:

答案 0 :(得分:3)

我不知道你想解决什么问题。

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

如果您正在讨论用您自己的代码替换此代码,您应该检查编译器/链接器的内部细节(并且非常确定您知道自己在做什么!!)。

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

答案 1 :(得分:1)

这样的事情怎么样:

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

main(){
  is_started(true);
}

答案 2 :(得分:0)

如果您的问题是关于Windows的,我知道您可以检测进程已启动的消息泵。这样你就可以确定所有内容都已初始化了。

当然,这不适用于* nix

答案 3 :(得分:0)

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

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