有没有一种标准的方法可以在初始化阶段运行一些代码并定义初始化的顺序

Is there a standard way to run some code during initialization phase and define the order of initialization?

本文关键字:初始化 运行 顺序 定义 段运行 代码 标准 一种 方法 有没有      更新时间:2023-10-16

我刚刚意识到,我已经用下面的代码结束了,只是为了能够在启动过程中进行一些初始化。我在问我是否遗漏了什么,是否有一些标准的方法可以在初始化期间运行一些代码,尤其是如果我们可以根据需要定义初始化顺序,因为初始化并没有完全按照预期进行。

#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;

因此在主之前的启动期间执行代码CCD_ 2。

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

如果初始化代码被拆分到几个[独立]编译单元,那么使用单个静态list<function...>的解决方案就不方便了。您可以使用Nifty计数器根据静态定义的实体的依赖关系自动排序调用。

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

使用GCC,您还可以为构造函数函数属性赋予优先级。