目标是允许头文件“注册”初始化函数,以便main可以迭代这些函数并调用它们。我偶然发现了一个使用__attribute__
的解决方案,但它似乎只是GCC(https://stackoverflow.com/a/37082249/7867841)。
// header1.h
void myInitializer(){}
REGISTER_THIS(&myInitializer);
// header2.h
void myInitializer2(){}
REGISTER_THIS(&myInitializer2);
// main.cpp
...
for_each_registered_ptr(){ call_ptr(); } // calls myInitializer and myInitializer2
...
这是否有通用解决方案?如果更容易实现,可以使用类或类型切换函数。
答案 0 :(得分:0)
您可以滥用tags = xc[:,0].astype(int)-1
函数本地来执行此操作,避免静态初始化顺序失败。
在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;
}
local仅在第一次调用函数时初始化一次。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