我在C中有来自另一种语言的解释器,我必须将代码(大约200行)从另一种语言传递给这个解释器,然后问题就出现了。
char* command_line[] = {
"",
"-e",
"print \"Hello from C!\\n\";"
};
此代码通过以下方式进行解析:
(..)
parser(my_p, NULL, 3, command_line, (char **)NULL);
(...)
在上面的代码中,我使用了数组,但即使是简单的代码,也必须在字符之前加上\,比如“;|\”。
如何避免这个问题并轻松传递200多行代码呢?
发布于 2013-08-21 17:48:14
如果您使用的是C++11,则可以使用原始字符串文字。
R"(print "Hello from C!\n";)"
或者,您可以简单地将所有数据放入一个外部文件中,然后在开始时读取它。不需要在那里转义任何数据。
发布于 2013-08-21 18:02:36
您可以使用C预处理器来为您完成字符串化:
#define STRINGIFY(...) #__VA_ARGS__
#define STRINGIFY_NL(...) #__VA_ARGS__ "\n"
char* command_line[] = {
"",
"-e",
STRINGIFY(print "Hello from C!\n";), //< one element of the array
//< another element of the array
//< with embedded NL
STRINGIFY_NL(print "Hello from C!") //< no comma and the next line is glued
STRINGIFY ("for a second time";), //< end of other string
};
要遵守的唯一限制是,可能的()
必须在STRINGIFY
的参数中保持平衡,并且必须将宏放在要转义的每一行上。
发布于 2013-08-21 17:49:35
不幸的是,C中不支持文字字符串或类似的有用构造,因此,如果您想在C程序中编写解释代码,则必须小心,并按照您所说的那样转义引号和斜杠。
另一种方法是将代码写入文本文件,并将其视为外部资源文件。您可以从代码内部将资源文件读入一个字符串,然后将其传递给parser()
。
它的易用性取决于您所使用的平台。Windows对资源文件有很好的支持,并将其嵌入到.exe文件中。我相信对gcc来说也是可能的,但我以前没有这样做过。恐怕有点含糊其辞,但我希望它能有所帮助。
https://stackoverflow.com/questions/18354029
复制相似问题