c++ - 如何使#include-file 的内容成为 cpp 文件中的编译时常量?

标签 c++ compiler-construction syntax self-modifying

我有一个文件 module.hpp

struct ModuleBase {
    virtual void run() = 0;
};

和一个main.cpp程序

int main() {
    cout << ...?...; // here should go the contents of module.hpp
}

我可以在...?... 放什么来让头文件的内容打印在这里?

一个基本的想法是

int main() {
    static const string content = R"(
#include <module.hpp>
)";
    cout << content;
}

但多行字符串仅在 C++11 中可用,#include 是否不能在多行字符串中工作(这很好)?

如果 gcc 有一个不可移植的方法...那将是一个开始。

澄清(更新):替换应该在编译时完成。

最佳答案

我所知道的唯一真正的解决方案是编写一个小程序 将文件转换为字符串变量的 C++ 定义 包含它。这写起来相当简单:输出一个简单的 header 如下:

char const variableName[] =

然后复制文件的每一行,将其包装在"...\n"中,然后 转义任何必要的字符。 (如果你能确定 C++11,那么你也许可以用 R"..." 做一些事情,但是 我没有这方面的经验。)

[更新:指的是其中有错字的原始问题]: 你的解决方案应该有效;如果是,这是一个错误 编译器。根据 §2.2, token 化发生在之前 执行预处理指令。所以当 预处理指令的执行发生,你有一个字符串 文字,不是 # 预处理标记。 (编译错误 在使用 C++11 功能时是可以预期的。没有过 实现者有足够的时间来解决所有错误 出。)

关于c++ - 如何使#include-file 的内容成为 cpp 文件中的编译时常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970548/

相关文章:

c++ - 继承和CRTP

c++ - Xcode: cstdlib 在全局命名空间中没有名为 "xxx"的成员

python - 我们应该为 python 变量名使用哪些缩写?

c++ - 如何解决此 "cast to pointer from type of different size"警告?

c++ - 有选择地将函数定义添加到 python 命名空间

c++ - 引擎 Matlab 问题

c++ - 无法编译项目,缺少 io.h 文件

compiler-construction - 可以修改 TCC 以使用 Emscripten 编译吗?如果没有,我在哪里可以找到可以生成 x86 的 C 编译器?

ruby - 用于 !在 ruby

java - 我需要通过参数仅传递类的几个属性之一