C/C++实现并传递代码
C / C++ implement and pass code
我在C中有来自另一种语言的解释器。我必须将来自另一语言的代码(大约200行)传递给这个解释器,这里出现了问题。
char* command_line[] = {
"",
"-e",
"print "Hello from C!\n";"
};
此代码由解析
(..)
parser(my_p, NULL, 3, command_line, (char **)NULL);
(...)
在上面的代码中,我使用数组,但即使是简单的代码也必须在";|\etc"等字符之前用\包装。
如何避免这个问题并舒适地通过200多行代码?
如果使用C++11,则可以使用原始字符串文字。
R"(print "Hello from C!n";)"
或者,您可以简单地将所有数据放入一个外部文件中,然后在启动时读取它。无需逃离那里的任何数据。
您可以使用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
的参数内部保持平衡,并且必须将宏放在要转义的每一行上。
不幸的是,C中不支持文本字符串或类似的有用结构,因此,如果您想在C程序中编写解释代码,则必须小心,并按照所述转义引号和斜杠。
另一种选择是将代码写入文本文件,并将其视为外部资源文件。您可以将代码内部的资源文件读取为字符串,然后将其传递给parser()
。
这样做的容易程度取决于您使用的平台。Windows非常支持资源文件并将其嵌入到.exe文件中。我相信gcc也有可能,但我以前没有做过。恐怕有点含糊,但我希望它能有所帮助。
您可以使用脚本将文本输入作为文件,并将其字符串化(转义双引号和换行符):
#!/usr/bin/env python
import sys
def main(argv = None):
if argv is None:
argv = sys.argv
if len(argv) < 2:
sys.stderr.write("Usage: stringify.py input.txt [... input.txt]n")
sys.exit(1)
i = 1
while i < len(argv):
inname = argv[i]
firstline = True
try:
infile = open(inname, "r")
for line in infile:
line = line.replace('"', '\"').replace('n', '\n')
sys.stdout.write('"{0}"n'.format(line))
except IOError, msg:
sys.stderr.write("exception {0}n".format(msg))
return 2
i = i + 1
return 0
if __name__ == "__main__":
sys.exit(main())
相关文章:
- gRPC 生成的代码缺少服务实现
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?
- 在实现合并排序代码时无法计算所有反转
- 如何实现此伪代码?
- 使用双LL在C++中实现Stack失败,出现异常"EXC_BAD_ACCESS(代码=2,地址=0x7fff5
- 如何减少大量包装类的实现代码?
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 实现在多线程代码中安全恢复的断点
- 与shared_ptr相比,更小的运行时数据结构和更快的代码可实现独特的_ptr
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 在C 中合并代码实现
- 优化代码/实现"for"循环而不是长"if - else if - else"
- VTK r(重置)键代码实现
- 如何将.h文件中的代码实现到main.cpp文件中
- 在我的解释器上为脚本代码实现语法检查器的最佳方式是什么
- 使用c++代码实现图像的颜色切换
- 如何加快此代码实现的OpenCV
- 难以使用限时代码实现类 (C++)