是否有标准方法在初始化阶段运行某些代码并定义初始化顺序?

时间:2014-09-02 07:52:55

标签: c++

我刚刚意识到我已经以下面的代码结束,只是为了能够在启动期间进行一些初始化。 我问我是否遗漏了某些东西,并且在初始化期间有一些标准的方法来运行一些代码,特别是如果我们可以根据需要定义初始化顺序,因为初始化并没有完全符合预期。

#define concat(a,b) a##b
#define autoname1(cnt) concat(autoname_,cnt)
#define autoname autoname1(__COUNTER__)

#define onStartupExecute_(func,structname) void func();\
          struct structname{structname(){func();}} autoname;

#define onStartupExecute(func) onStartupExecute_(func,autoname)

使用上述代码时,例如我们定义:

void someInitialization(){doSomething1;doSomething2;}
onStartupExecute(someInitialization)

onStartupExecute生成的代码是:

struct autoname_12{autoname_12(){someInitialization();}} autoname_13;

所以在main之前启动代码someInitialization之前。

我认为应该有一些更简单的方法来做到这一点!

2 个答案:

答案 0 :(得分:1)

如果初始化代码在多个[独立]编译单元中分割,则具有单个静态list<function...>的解决方案不方便。您可以使用Nifty Counters自动按顺序对静态定义的实体进行调度。

是的,专用类的静态实例是在main()之前和之后执行某些代码的常用方法。您应该记住,在给定的编译单元中,它们按照其定义的顺序进行初始化,并以相反的顺序销毁。几个独立编译单元(.o文件)之间的初始化顺序可能会有所不同,具体取决于单元的依赖关系。 NiftyCounter技术允许或多或少地明确地订购这些模块。

答案 1 :(得分:0)

使用GCC,您还可以优先考虑constructor函数属性。