gpt4 book ai didi

C++ cpp 文件作为模块

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:28 25 4
gpt4 key购买 nike

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

通过动态加载库实现这一点看起来很容易。主程序可以扫描某个文件夹中的所有 .dll 文件,加载每个文件并从每个模块调用导出的“加载”符号。在析构函数中,主程序可以调用“卸载”符号,以便模块可以清理。

我想要相同的但具有整体程序。 .cpp 文件有没有办法注册自己,以便主程序可以在某个时候调用它们的 init() 函数?或者让主程序找到所有这些模块?

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

最佳答案

您可以在每个 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_ 设为静态局部变量,以确保在首次访问之前对其进行初始化。

关于C++ cpp 文件作为模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com