您可以濫用static
函數本地執行此操作,避免靜態初始化順序失敗。
在init.h
,我們有這樣的:
#ifndef INIT_H
#define INIT_H
#include <vector>
// Can be changed to std::function<...> or whatever you need.
typedef void (*init_fn)();
// Returns int so it can easily be used in a variable initializer.
int register_initializer(init_fn fn);
std::vector<init_fn> & get_initializers();
#endif
然後,在init.cpp
:
#include "init.h"
int register_initializer(init_fn fn)
{
get_initializers().push_back(fn);
return 0;
}
std::vector<init_fn> & get_initializers()
{
static std::vector<init_fn> ip;
return ip;
}
的幾個注意事項,我們進入到休息前:
- 的
static
本地只是初始化一次,第一次調用該函數。
- 「全局」向量是泄漏種類。除非你爲這個向量添加數以萬計的條目,否則這不太可能會成爲問題。您可以隨時使用
get_initializers().clear()
將其清空。
我們會使用它像這樣,在a.cpp
:
#include <iostream>
#include "init.h"
static void a_init() { std::cout << "a_init()\n"; }
static auto dummy = register_initializer(a_init);
最後,我們有我們的(很簡單)main.cpp
:
#include "init.h"
int main() {
for (auto fn : get_initializers()) {
fn();
}
return 0;
}
另外值得注意的,該解決方案線程安全只有自C++ 11(魔術靜態) –