如何在main之前立即调用函数或静态初始化对象
How can I call a function or statically initialize an object immediately before main?
简而言之,我希望一段特定的静态初始化尽可能靠近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)
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销