модульность — C ++ cpp файлы как модули

Извините, если я дублирую другой вопрос, но я не знаю, как его погуглить.
Я хочу добавить небольшую модульность в мою программу: некоторые файлы .cpp должны быть скомпилированы как «модули». Основное требование — чтобы я мог добавлять модули, просто добавляя в проект новый файл .cpp, без каких-либо изменений других файлов.

Достижение этого выглядит легко с динамическими библиотеками загрузки. Основная программа может сканировать какую-либо папку для всех файлов .dll, загружать каждый из них и вызывать экспортированный символ «загрузки» из каждого модуля. В деструкторе основная программа может вызывать символы «выгрузить», чтобы модули могли очиститься.

Я хочу то же самое, но с монолитной программой. Есть ли способ зарегистрировать файлы .cpp, чтобы основная программа могла вызвать их функции init () в какой-то момент? Или для основной программы найти все такие модули?

Как это делается в ядре Linux? Я знаю, простое добавление файлов .c заставляет их работать как-то.

2

Решение

Вы можете использовать статическую фиктивную переменную внутри каждого файла cpp и инициализировать ее лямбда-выражением, выполняющим инициализацию и регистрацию. Тривиальный пример:

// 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_ быть статической локальной переменной, чтобы удостовериться, что она инициализируется перед первым доступом.

2

Другие решения

Вы можете добавить новый .cpp файлы в статически связанное приложение без изменения существующего кода с помощью интерфейса регистрации, который открывается из основного приложения (singleton).

Что-то вроде

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;
1

По вопросам рекламы [email protected]