C++ C/C++;实现并传递代码
我有C语言的另一种语言的解释器。我必须将另一种语言的代码(大约200行)传递给这个解释器,这里出现了问题C++ C/C++;实现并传递代码,c++,c,C++,C,我有C语言的另一种语言的解释器。我必须将另一种语言的代码(大约200行)传递给这个解释器,这里出现了问题 char* command_line[] = { "", "-e", "print \"Hello from C!\\n\";" }; 此代码由以下人员解析: (..) parser(my_p, NULL, 3, command_line, (char **)NULL); (...) 在代码abobe中,我使用数组,但即使是简单的代码也必须在“;”等字
char* command_line[] = {
"",
"-e",
"print \"Hello from C!\\n\";"
};
此代码由以下人员解析:
(..)
parser(my_p, NULL, 3, command_line, (char **)NULL);
(...)
在代码abobe中,我使用数组,但即使是简单的代码也必须在“;”等字符之前使用\进行包装
如何避免此问题并传递200多行代码?您可以使用脚本将文本输入作为文件,并将其字符串化(转义双引号和换行符):
!/usr/bin/env python
导入系统
def干管(argv=无):
如果argv为None:
argv=sys.argv
如果len(argv)<2:
sys.stderr.write(“用法:stringify.py input.txt[…input.txt]\n”)
系统出口(1)
i=1
而i
您可以使用脚本将文本输入作为文件,并将其字符串化(转义双引号和换行符):
!/usr/bin/env python
导入系统
def干管(argv=无):
如果argv为None:
argv=sys.argv
如果len(argv)<2:
sys.stderr.write(“用法:stringify.py input.txt[…input.txt]\n”)
系统出口(1)
i=1
而i
如果您使用的是C++11,则可以使用原始字符串文本
R"(print "Hello from C!\n";)"
或者,您可以简单地将所有数据放入一个外部文件,并在开始时读取。无需转义其中的任何数据。如果您使用的是C++11,则可以使用原始字符串文字
R"(print "Hello from C!\n";)"
或者,您可以简单地将所有数据放入一个外部文件中,并在开始时读取。无需转义那里的任何数据。不幸的是,C中不支持文字字符串或类似的有用结构,因此如果您想在C程序中编写解释代码,您必须小心,在编写时转义引号和斜杠阿维说 另一种方法是将代码写入文本文件,并将其视为外部资源文件。您可以从代码内部将资源文件读入字符串,然后将其传递给
解析器()
这取决于您使用的平台。Windows很好地支持资源文件并将它们嵌入到.exe文件中。我确信gcc也可以,但我以前没有这样做过。我恐怕有点含糊,但我希望它能有所帮助。不幸的是,C中不支持文本字符串或类似的有用结构,因此,如果你想在你的C程序中编写解释过的代码,你必须小心,并像你所说的那样转义引号和斜杠 另一种方法是将代码写入文本文件,并将其视为外部资源文件。您可以从代码内部将资源文件读入字符串,然后将其传递给
解析器()
这取决于您使用的平台。Windows对资源文件有很好的支持,并将它们嵌入到.exe文件中。我相信gcc也可以,但我以前没有这样做过。我恐怕有点含糊不清,但我希望它能帮到您。您可以使用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\u NL(…)\uuu VA\u ARGS\uu\n
字符*命令行[]={
"",
“-e”,
STRINGIFY(打印“Hello from C!\n”),//<数组的一个元素
//<数组的另一个元素
//<使用嵌入式NL
STRINGIFY_NL(打印“Hello from C!”)//<不使用逗号,下一行是粘合的
STRINGIFY(“第二次”),//<其他字符串的结尾
};
要遵守的唯一限制是,可能的
()
必须在STRINGIFY
的参数内保持平衡,并且必须将宏放在要转义的每一行上。可以使用C预处理器为您执行STRINGIFY:
#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\u NL(…)\uuu VA\u ARGS\uu\n
字符*命令行[]={
"",
“-e”,
STRINGIFY(打印“Hello from C!\n”),//<数组的一个元素
//<数组的另一个元素
//<使用嵌入式NL
STRINGIFY_NL(打印“Hello from C!”)//<不使用逗号,下一行是粘合的
STRINGIFY(“第二次”),//<其他字符串的结尾
};
唯一需要遵守的限制是可能的
()
必须在STRINGIFY
的参数中保持平衡,并且必须将宏放在要转义的每一行上。就目前而言,这是一个可怕的问题。解析器
做什么?你不能从这个问题中分辨出任何东西。这不太糟糕!我的理解是,他只是想为其编写代码“C语言”或“C++”(C语言)中的“C语言”或“C++”(11)在C++中没有这样的选择。在C中,没有这样的运气。但是为什么不读FRO?