在依赖另一个第三方库的情况下处理库时,我遇到了第三方库绝对垃圾需要手动调用全局设置和清理功能的问题。
int main()
{
setup();
//do stuff
cleanup();
}
现在,这是一个完整的sh * t显示在应用程序代码中没有太多问题,因为它只是语法上的恐怖,但实际上是库中的痛苦。
库假设来抽象出这些奇怪的实现细节,并且要求用户调用一个设置函数就像打了我自己的脸。
我试图让它们消失
//namespace scope
struct AutoMagic
{
AutoMagic() {setup();}
~AutoMagic() {cleanup();}
};
AutoMagic automagic;
然后我意识到这不适用于翻译单元,如此处所见
因此标题中的问题。
答案 0 :(得分:0)
您可以尝试这样的事情:
std::shared_ptr<AutoMagic> init(){
static std::shared_ptr<AutoMagic> ptr(new AutoMagic{});
return ptr;
}
并在每个翻译单位中执行:
auto libMagic = init();
我没有对它进行测试,但无论哪个翻译单元首先调用init()
都应该创建对象,而最后卸载的shared_ptr
应调用析构函数。
答案 1 :(得分:0)
最后,唯一可行的事情是不可移植的编译器特定代码
AutoMagic automagic __attribute__((init_priority(420));
不可移植,基本上所有主流编译器都支持这个,除了msvc。
此属性强制在没有此属性的所有变量和优先级大于此变量的变量之前初始化变量。
这说明 确实是对初始化优先级保证的要求,而且标准显然还没有给出。
答案 2 :(得分:-1)
两个可靠的选项:
setup()
和cleanup()
我会道歉,但这确实是第三方作者的错。所以你应该 k * ll th * m 让他们道歉。