在编译时将文件读入字符串

1ac*_*ace 19 c c++ include c-preprocessor

我想在文件中写一些东西(让我们调用它foo.cpp)在编译时将它作为字符串包含到我的程序,类似于#include它的方式.

现在我正在使用这个C预处理器#define:

#define toString(src) #src
Run Code Online (Sandbox Code Playgroud)

将一堆代码转换为字符串,如下例所示:

const char* str = toString(
  int x;
  void main(){}
);
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在那里阅读宏字符串化.

我想将该代码移动到外部文件,该文件将在编译时"链接". 我不希望文件必须与程序一起分发,如果我在运行时读取它就是这种情况.

我尝试使用#include如下所示的指令,但编译器拒绝了它:

const char* str = toString(
#include "foo.cpp"
);
Run Code Online (Sandbox Code Playgroud)

g++似乎完全困惑,但clang++给了我这个错误:

error: embedding a #include directive within macro arguments is not supported
Run Code Online (Sandbox Code Playgroud)

有谁知道是否/如何做到这一点?

注意:我正在使用它来编写我的GLSL着色器,尽管我怀疑这些信息是否有用.

PS:在你告诉我这是一个重复的问题之前,将我的代码放在一个巨大的字符串中,或​​者使用外部工具(例如xxd)来转储它的十六进制表示对我来说不是"解决方案",因为它们是不比我现在的方法更好(即更容易/更清洁).


几年后更新:
我刚刚意识到我从来没有回答过这个问题,因为它被重复关闭了.当我看到这个提交时,我找到了我正在寻找的答案,它本身基于对本文的评论,并且从那时起就一直在使用它.

简而言之,一个小的汇编文件包含您想要的文件NAME,并使用这三个变量在给定的文件下公开它们NAME_begin,NAME_endNAME_len允许您从C代码访问它们的内容.

这样,你有一个普通的文件只包含你想要的代码,并且它在编译时自动读取,而不必在运行时读取它或者必须跳过xxd箍.

Ser*_* L. 12

我不太确定你要完成什么,但Linux命令行实用程序xxd可能正是你要找的:

xxd -i [filename]
Run Code Online (Sandbox Code Playgroud)

将生成一个C样式头文件,其中包含一个数组,其中包含完整二进制编码的文件内容和一个长度为的变量.

例:

xxd -i /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)

制作一个文件

unsigned char _proc_cpuinfo[] = {
  0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x09, 0x3a, 0x20,
  0x30, 0x0a, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x09,
...
};
unsigned int _proc_cpuinfo_len = 654390;
Run Code Online (Sandbox Code Playgroud)

您可以在代码中包含结果头,并通过这些变量访问数组和文件长度.

  • 正如我在问题中所说,这个解决方案既不比我现在的方法更容易也更清洁*(这是主观的)*,但感谢复制/粘贴:) (3认同)

Mar*_*som 8

你说你不喜欢,xxd因为它使文件不可读.很公平.编写自己的实用程序可以很简单,它以不同的格式对数据进行编码,因为您特别希望字符串作为输入和输出.您可以利用字符串文字串联来使其易于阅读.

const char* str =
#include "foo.h"
    ;
Run Code Online (Sandbox Code Playgroud)

foo.h中:

"  int x;" "\n"
"  void main(){}" "\n"
Run Code Online (Sandbox Code Playgroud)

我简单地尝试使用C++ 11的原始字符串文字,它允许在不重新格式化的情况下使用该文件,但它不起作用.它#include被认为是字符串的一部分,而不是根据需要包含文件.