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

tow*_*owi 9 c++ compiler-construction syntax self-modifying

我有一个文件 module.hpp

struct ModuleBase {
    virtual void run() = 0;
};
Run Code Online (Sandbox Code Playgroud)

和一个main.cpp程序

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

我可以用什么来...?...打印头文件的内容?

一个基本的想法是

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

但多线串仅适用于C++ 11,而#include不会没有多行字符串内工作(这是很好的)?

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

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

Jam*_*nze 5

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

char const variableName[] =
Run Code Online (Sandbox Code Playgroud)

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

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