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

时间:2013-02-08 16:36:37

标签: c++ visual-c++ main static-initialization

简而言之,我希望一个特定的静态初始化尽可能接近main()/ DllMain()的开头。在静态初始化期间,这可能是一个名为last的构造函数。

由于这几乎肯定是特定于编译器的实现,我特别希望使用visual C ++编译器(VS 2010及更高版本)来实现这一点。将来我可能需要在GCC和Clang这样做,但这不是一个直接关注的问题。

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

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

2 个答案:

答案 0 :(得分:2)

以上Refugnic Eternium的评论是正确的,并提供了一种解决方案。

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

BOOL InitMyLib();

MyLib.dll中的所有函数和所有构造函数都应该失败,直到调用它为止。这样你就可以确保程序员不要忘记调用它。

答案 1 :(得分:0)

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

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

static MyInitializer myInit;

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

Use #pragma init_seg to Control Static Construction (KB104248)