【发布时间】:2013-11-07 10:44:09
【问题描述】:
我想在一个文件中写一些东西(我们称之为foo.cpp)并将它作为一个字符串包含在我的程序中在编译时,类似于方式#include 做到了。
现在我正在使用这个 C 预处理器 #define:
#define toString(src) #src
将一堆代码转换为字符串,如本例所示:
const char* str = toString(
int x;
void main(){}
);
如果需要,您可以阅读有关宏字符串化there 的信息。
我想将该代码移动到一个外部文件,该文件将在编译时“链接”。 我不希望文件必须与程序一起分发,如果我要在运行时读取它就会出现这种情况。
我尝试使用如下所示的#include 指令,但编译器拒绝了它:
const char* str = toString(
#include "foo.cpp"
);
g++ 似乎完全糊涂了,但是clang++ 给了我这个错误:
error: embedding a #include directive within macro arguments is not supported
有谁知道是否/如何做到这一点?
注意:我正在使用它来编写我的 GLSL 着色器,尽管我怀疑这些信息是否有用。
PS:在你告诉我这是 this question 的副本之前,将我的代码放在自己文件中的巨大字符串中或使用外部工具(例如 xxd)转储其十六进制表示是对我来说不是“解决方案”,因为它们并不比我目前的方法更好(即更容易/更清洁)。
几年后更新:
我刚刚意识到我从来没有回答过这个问题,因为它被关闭为重复。
当我看到this commit 时,我找到了我正在寻找的答案,它本身基于a comment on this article,并且一直在使用它。
简而言之,一个小的汇编文件包含您想要的文件,并在给定的NAME 下公开它们,其中三个变量NAME_begin、NAME_end 和NAME_len 允许您从 C 访问它们的内容代码。
这样,您就拥有一个只包含您想要的代码的普通文件,并且它会在编译时自动读取,而不必在运行时读取它或跳过xxd 箍。
【问题讨论】:
-
它是链接问题的副本。您只是不喜欢提供的任何答案。但答案是你不能按照你想要的方式去做,所以你只会得到一堆反映链接问题答案的答案。
-
你试图为什么平台编译......或者你试图让它跨平台?
-
我试图理解术语“更好”、“更容易”和“更清洁”如何应用于 this 方法,更不用说其他任何方法了。只是为了理解,您想预处理到源级变量字符串集,然后使用尚未见过的代码将其写入文件,然后从源代码编译所述文件,而您遇到的麻烦是在步骤 1 的“源”中嵌入预处理器语句?
-
@MarkRansom:实际上它是在 C++ 中:
raw-string: " d-char-sequenceopt( r-char-sequenceopt) d-char-sequenceopt"(词汇语法要求该序列前面紧跟一个大写的 R。) -
我投票重新打开它,因为它有一个 C++ 答案,不适合仅 C 的“重复”。 @rici 为什么不让它成为一个答案,让 OP 决定它是否更好,因为宏 hack 没有做他想做的事?
标签: c++ c include c-preprocessor