【问题标题】:Is there any way to transform strings into compileable/runnable code?有没有办法将字符串转换为可编译/可运行的代码?
【发布时间】:2014-04-08 05:41:30
【问题描述】:

例如,假设我们有这样一个字符串:

string x = "for(int i = 0; i < 10; i++){cout << \"Hello World!\n\";}"

完成以下函数定义的最简单方法是什么:

void do_code(string x); /* given x that's valid c++ code, executes that code  as if it were written inside of the function body */

【问题讨论】:

  • 编译器一直在这样做。但它确实需要编译器才能正确完成。
  • 与其他语言(如 python、ruby 或 javascript)不同,这在 C++ 中并不简单。
  • 我猜这可以在 C++ 中的一行中完成。
  • 这个问题的“正确”答案可能是“不要那样做”。

标签: c++


【解决方案1】:

标准 C++ 库不包含 C++ 解析器/编译器。这意味着您唯一的选择是查找并链接 C++ 编译器库,或者简单地将字符串输出为文件并使用系统调用启动 C++ 编译器。

首先,链接到 C++ 编译器实际上在诸如 Visual Studio 之类的东西中是非常可行的,它确实具有用于编译 C++ 并生成可以在运行时链接的新 DLL 的 DLL 库。

第二件事,几乎是任何 IDE 所做的事情。它将您的文本编辑器内容保存到 C++ 文件中,通过系统执行编译器对其进行编译并运行输出。

也就是说,有许多语言内置解释器,更适合运行时代码解释。

【讨论】:

  • +1 - 很多实心点。也有 C++ 子集的解释器 - 有 other questions 关于这些....
【解决方案2】:

不是直接因为您要求同时编译和解释 C++。

但是有LLVM,这是一个编译器框架和API。在这种情况下,这将允许您获取包含有效 C++ 的字符串,调用 LLVM 基础结构,然后使用基于 LLVM 的即时编译器,如长度 here 所述。请记住,您还必须支持 C++ 库。您还应该有一些机制将变量映射到您解释的 C++ 中并取出数据。

一项大而有价值的事业,似乎有人可能已经做过类似的事情了,也许Cling 就是这样。

【讨论】:

    【解决方案3】:

    使用动态链接加载器(仅限 POSIX)

    这已经在 Linux 和 OSX 中测试过了。

    #include<fstream>
    #include<string>
    #include<cstdlib>
    #include<dlfcn.h>
    
    void do_code( std::string x ) {
      { std::ofstream s("temp.cc");
        s << "#include<iostream>\nextern \"C\" void f(){" << x << '}'; }
      std::system( "g++ temp.cc -shared -fPIC -otemp.o" );
      auto h = dlopen( "./temp.o", RTLD_LAZY );
      reinterpret_cast< void(*)() >( dlsym( h, "f" ) )();
      dlclose( h );
    }
    
    int main() {
      std::string x = "for(int i = 0; i < 10; i++){std::cout << \"Hello World!\\n\";}";
      do_code( x );
    }
    

    Try it online! 您需要使用-ldl 参数进行编译以链接libdl.a。不要将它复制粘贴到生产代码中,因为它没有错误检查。

    【讨论】:

      【解决方案4】:

      为我工作:

      system("echo \"#include <iostream> \nint main() { for(int i = 0; i < 10; i++){std::cout << i << std::endl;} }\" >temp.cc; g++ -o temp temp.cc && ./temp");
      

      【讨论】:

      • 我认为原始问题暗示了它的不可移植性:)
      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2023-01-30
      • 2016-04-18
      • 1970-01-01
      • 2011-02-24
      相关资源
      最近更新 更多