代码之家  ›  专栏  ›  技术社区  ›  Josh Weinstein

编译并运行C源代码字符串

gcc c
  •  0
  • Josh Weinstein  · 技术社区  · 6 年前

    所以,我想编译并运行一个C源代码字符串,其中字符串是 const char* 代表整个程序。它应该取自常量或构造字符串,例如

    const char* prog = "#include <stdio.h> int main(void) {puts(\"foo\"); return 0;}"
    

    我已经试过了 tcclib 但它目前并没有建立在Mac操作系统之上,由于缺乏一致的维护人员,我认为这不是一个可行的方法。

    我主要想问的是,这是一种为编译为C的编程语言提供后端的方法。 gcc clang 那也行。

    注意:这特别是关于从C编译C代码,而不是将其注入到进程中。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nick ODell    6 年前

    @布鲁诺我的想法是不必处理不同的Windows和Unix路径名(Windows UTF-16路径名)。但也许仅仅调用GCC是一个更好的解决方案。

    我认为打电话给GCC是最容易的。但是,仅仅因为您将GCC称为外部进程,并不意味着您必须将生成的C写到一个文件中。

    GCC能够从标准中获取其输出。下面是一个用bash编写的示例。

    echo "main(){}" | gcc -x c -
    

    在C中有同样的事情:

    #include <stdio.h>
    #include <string.h>
    
    const char *prog = "#include <stdio.h>\nint main(void) {puts(\"foo\"); return 0;}";
    
    int main() {
        FILE *proc = popen("gcc -x c -", "w");
        fwrite(prog, sizeof(char), strlen(prog), proc);
        pclose(proc);
    }
    

    这里有同样的事情,但是对于错误处理:

    #include <stdio.h>
    #include <string.h>
    
    const char *prog = "#include <stdio.h>\nint main(void) {puts(\"foo\"); return 0;}";
    
    int main() {
        FILE *proc = popen("gcc -x c -", "w");
        if(!proc) {
            perror("popen gcc");
        }
        fwrite(prog, sizeof(char), strlen(prog), proc);
        if(ferror(proc)) {
            perror("writing prog");
        }
        if(pclose(proc) == -1) {
            perror("pclose gcc");
        }
    }
    

    我认为这是实现这一目标的最佳方式。