如何在main之前立即调用函数或静态初始化对象

How can I call a function or statically initialize an object immediately before main?

本文关键字:函数 调用 静态 对象 初始化 main      更新时间:2023-10-16

简而言之,我希望一段特定的静态初始化尽可能靠近main()/DllMain()的开头。这可能是一个在静态初始化期间最后调用的构造函数。

由于这几乎肯定是一个特定于编译器的实现,我特别希望使用visual C++编译器(VS 2010及以后版本)来实现这一点。在未来,我可能需要在GCC和Clang这样做,但这不是当务之急。

长话短说,我在一个基本库中有一个对象,它被静态初始化,并在其构造函数中创建一个线程。这个线程依赖于我们不控制的库中其他静态初始化的对象,因此它在静态初始化中会导致竞争条件。如果我可以暂停或避免创建线程,直到所有其他静态初始化完成,这应该可以解决问题(简单的Sleep(5000)可以避免这个问题,尽管这不是一个可靠的解决方案)。

我可以在main()函数中显式调用initialize函数,但这并不理想,因为我们有20多个二进制文件使用这个库,所以每个程序员都必须记住在每个二进制文件中运行初始化。如果可能的话,我更愿意把这个责任推给编译器。

Refugnic Eternium上面的注释是正确的,并且提供了一个解决方案。

最好的解决方案是具有这样的功能:

BOOL InitMyLib();

MyLib.dll中的所有函数以及所有

创建一个初始化器类,然后声明它的静态实例:

class MyInitializer
{
    public:
    MyInitializer ()
    {
        doInitStuffHere();
    }
};
static MyInitializer myInit;

当使用#pragma init_seg初始化静态变量时,您可以控制。例如,#pragma init_seg(lib)。

使用#pragma init_seg控制静态构造(KB104248)