启动时自动启动库(ies)

时间:2015-01-02 15:48:24

标签: c++ c++17

我有一堆静态init()方法,我需要在应用程序启动时调用它们。有点像:

A::init();
S::init();
//...

这样做的一种方法是初始化一个静态变量,如下所示:

static bool const b{A::init(), S::init(), false};

是否存在更好的替代方案?

5 个答案:

答案 0 :(得分:3)

您可以使用启动类的实例来初始化其构造函数中的各种组件,并在其析构函数中终止它们。例如:

struct Startup
{
    Startup()
    {
        A::Init();
        B::Init();
    }
    ~Startup()
    {
        B::Term();
        A::Term();
    }
};

namespace { Startup startup; }

int main()
{
    // do stuff being completely oblivious to the startup
}

答案 1 :(得分:3)

我曾经和#34;生活在主要生活之前玩过#34;很多次,在意识到它通常比必要的更痛苦之前。

我的建议是:

int main() {
    A::init();
    S::init();

    // ...
}

为清楚起见,可能值得创建init函数,该函数将依次调用所有这些函数。

除非各个库之间的依赖关系树非常明确,否则我建议反对打包(即B::init调用A::init),因为在钻石依赖的情况下,你最终可能会多次调用基础库init

答案 2 :(得分:3)

不要自动初始化。在main内启动期间明确初始化子系统。

原因是:

  1. 您可以控制初始化顺序
  2. 如果初始化失败,您可以正确处理
  3. 如果初始化导致崩溃,您将更容易调试并希望拥有正确的堆栈跟踪
  4. 确保您完全了解初始化过程

答案 3 :(得分:1)

您可以使用init_dispatch模板通过可变参数列表调用init()

template<typename T>
struct dispatch
{
    dispatch() { T::init(); }
};

template<typename... Ts>
struct init_dispatch : std::false_type
                     , dispatch<Ts>...
{
    init_dispatch() : dispatch<Ts>{}... {}
};

static bool const b = init_dispatch<A, S>{}.value;

Demo

答案 4 :(得分:1)

就个人而言,我绝对建议保持简单:在main内初始化内容,而不是使用魔法静态。这样就明确了它的发生,并且发生时它是明确的。并且您可以在应用程序发生之前和之后推断应用程序的状态。

main之前和之后发生的任何事情往往会导致麻烦。