如何执行自动设置功能

时间:2017-05-02 16:07:47

标签: c++ initialization raii

在依赖另一个第三方库的情况下处理库时,我遇到了第三方库绝对垃圾需要手动调用全局设置和清理功能的问题。

int main()
{
    setup();
    //do stuff
    cleanup();
}

现在,这是一个完整的sh * t显示在应用程序代码中没有太多问题,因为它只是语法上的恐怖,但实际上是库中的痛苦。

假设来抽象出这些奇怪的实现细节,并且要求用户调用一个设置函数就像打了我自己的脸。

我试图让它们消失

//namespace scope
struct AutoMagic
{
    AutoMagic() {setup();}
    ~AutoMagic() {cleanup();}
};
AutoMagic automagic;

然后我意识到这不适用于翻译单元,如此处所见

因此标题中的问题。

3 个答案:

答案 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)

可悲的是,你真的无法摆脱这种局面。你对全局实例有一个很好的想法,但实际上这对依赖关系来说并不是很好。它还有一个问题,即链接器可能会对其进行优化,除非您使用&#34;它还是小心构建选项;我在共享库中遇到了实体注册类实例的问题。

两个可靠的选项:

  1. 将类似的件cr * p 设置/拆卸功能添加到您自己的库中,这将遵循setup()cleanup()
  2. 更改库
  3. 我会道歉,但这确实是第三方作者的错。所以你应该 k * ll th * m 他们道歉。