C ++ cpp文件作为模块

时间:2016-12-28 18:24:38

标签: c++ modularity

很抱歉,如果我复制其他问题,但我不知道如何谷歌。 我想为我的程序添加一些小的模块化:一些.cpp文件应编译为“模块”。主要要求是我应该能够通过向项目添加新的.cpp文件来添加模块,而无需以任何方式更改其他文件。

使用动态加载库实现此功能非常简单。主程序可以扫描所有.dll文件的某个文件夹,加载每个文件并从每个模块调用导出的“加载”符号。在析构函数中,主程序可以调用“卸载”符号,以便模块可以清理。

我想要一样但是有单片程序。是否有任何方法可以让.cpp文件自行注册,以便主程序可以在某些时候调用它们的init()函数?或者主程序找到所有这些模块?

如何在Linux内核中完成?我知道简单的添加.c文件会让它们以某种方式工作。

2 个答案:

答案 0 :(得分:2)

您可以在每个cpp文件中使用静态虚拟变量,并通过执行初始化和注册的lambda对其进行初始化。琐碎的例子:

// registration.h

void register_cpp (std::string name);
void print_cpps ();

// registration.cpp
namespace {
   std::vector<std::string> & names () {
      static std::vector<std::string> names_ {};
      return names_;
   }
}

void register_cpp (std::string name) {
   names ().push_back (name); // well, push_back(std::move (name)) would be more efficient
}

void print_cpps () {
    for (auto && name : names()) { std::cout << name << "\n"; }
}

// a.cpp

#include "registration.h"
static std::nullptr_t e = ([] () { register_cpp ("a"); return nullptr; }) ();

// b.cpp

#include "registration.h"
static std::nullptr_t e = ([] () { register_cpp ("b"); return nullptr; }) ();

// main.cpp
#include "registration.h"
int main () {
   print_cpps ();
   return 0;
}

我认为你需要names_作为一个静态局部变量,以确保它在第一次被访问之前被初始化。

答案 1 :(得分:1)

您可以将新的.cpp文件添加到静态链接的应用程序,而无需使用从主应用程序(单例)公开的注册界面更改现有代码。

这样的东西

App.h:

 struct IModule {
     virtual void init() = 0;
     virtual ~IModule() {}
 };

 class App {
 public:
      void registerModule(IModule* newModule); // Stores the interface
                                               // pointer of an additional
                                               // module
      static App& instance() {
           static App theInstance;
           return theInstance;
      }
 };

NewModule.cpp:

 #include "App.h"

 class NewModule : public IModule {
 public:
      void init();
 private:
      NewModule() {
          App::getInstance().registerModule(this);
      }

      static NewModule instance;
 };

 NewModule NewModule::instance;