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

标签 c++ visual-c++ program-entry-point static-initialization

简而言之,我希望特定的静态初始化部分尽可能靠近 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/

相关文章:

java - 从 main 方法调用方法

c++ - 从 C0X32.OBJ 引用的未解析的外部 '_main'

c++ - 编译器显示错误消息 "makes pointer from integer without cast"(反转数组)。我该如何解决这个问题?

c++ - OpenCL 找不到 Intel HD 4000

C++ irc​​ 客户端异步读写

delphi - Delphi应用程序中子菜单位置错误

c++ - C++ 98 标准在哪里指定本地声明的模板名称不依赖?

c++ - 字符指针(由 new 分配)及其初始化

visual-c++ - SSE SIMD 循环优化

c++ - 为什么 std::mutex 在带有 WIndows SOCKET 的结构中使用时会创建 C2248?