在标头中排队呼叫

时间:2017-04-14 16:43:36

标签: c++ module extern

目标是允许头文件“注册”初始化函数,以便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
...

这是否有通用解决方案?如果更容易实现,可以使用类或类型切换函数。

1 个答案:

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