我刚刚意识到我已经以下面的代码结束,只是为了能够在启动期间进行一些初始化。 我问我是否遗漏了某些东西,并且在初始化期间有一些标准的方法来运行一些代码,特别是如果我们可以根据需要定义初始化顺序,因为初始化并没有完全符合预期。
#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
之前。
我认为应该有一些更简单的方法来做到这一点!
答案 0 :(得分:1)
如果初始化代码在多个[独立]编译单元中分割,则具有单个静态list<function...>
的解决方案不方便。您可以使用Nifty Counters自动按顺序对静态定义的实体进行调度。
是的,专用类的静态实例是在main()
之前和之后执行某些代码的常用方法。您应该记住,在给定的编译单元中,它们按照其定义的顺序进行初始化,并以相反的顺序销毁。几个独立编译单元(.o
文件)之间的初始化顺序可能会有所不同,具体取决于单元的依赖关系。 NiftyCounter
技术允许或多或少地明确地订购这些模块。
答案 1 :(得分:0)
使用GCC,您还可以优先考虑constructor函数属性。