简而言之,我希望特定的静态初始化部分尽可能靠近 main()/DllMain() 的开头发生。这是在静态初始化期间最后调用的构造函数可能是可以接受的。
由于这几乎肯定是特定于编译器的实现,因此我特别希望使用 Visual C++ 编译器(VS 2010 及更高版本)来执行此操作。将来我可能需要在 GCC 和 Clang 中执行此操作,但这不是当务之急。
长话短说,我在基础库中有一个对象,该对象被静态初始化并在其构造函数中创建一个线程。该线程依赖于我们无法控制的库中其他静态初始化的对象,因此它会导致静态初始化中的竞争条件。如果我可以暂停或避免创建线程,直到所有其他静态初始化完成,这应该可以解决问题(简单的 Sleep(5000) 可以避免该问题,尽管这不完全是一个可靠的解决方案)。
我可以在 main() 函数中显式调用初始化函数,但这并不理想,因为我们有 20 多个使用该库的二进制文件,因此每个程序员都必须记住在每个二进制文件中运行初始化。如果可能的话,我更愿意将这个责任推给编译器。
最佳答案
上面 Refugnic Eternium 的评论是正确的,并且提供了一种解决方案。
最好的解决方案是有一个像这样的函数:
BOOL InitMyLib();
在调用此函数之前,MyLib.dll 中的所有函数以及所有构造函数都应该失败。这样您就可以确保程序员不会忘记调用它。
关于c++ - 如何在 main 之前立即调用函数或静态初始化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14777204/