C/C++实现并传递代码

C / C++ implement and pass code

本文关键字:代码 实现 C++      更新时间:2023-10-16

我在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())