我刚刚意识到我已经以下面的代码结束,只是为了能够在启动期间进行一些初始化。 我在问我是否遗漏了什么,是否有一些标准方法可以在初始化期间运行一些代码,特别是如果我们可以根据需要定义初始化顺序,因为初始化没有完全按预期进行。
#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
。
我认为应该有一些更简单的方法来做到这一点!
最佳答案
如果初始化代码被拆分到多个[独立]编译单元,那么使用单个静态的解决方案 list<function...>
不方便。您可以使用 Nifty Counters根据依赖关系自动对静态定义实体的调用进行排序。
是的,专用类的静态实例是在main()
之前和之后执行一些代码的常用方法。 .您应该记住,在给定的编译单元中,它们按照定义的顺序进行初始化,并以相反的顺序销毁。几个独立编译单元(.o
文件)之间的初始化顺序可能会有所不同,具体取决于单元的依赖关系。 NiftyCounter
技术允许或多或少明确地订购这些模块。
关于c++ - 是否有一种标准方法可以在初始化阶段运行一些代码并定义初始化顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25618450/