有没有办法将字符串转换为可编译/可运行的代码?

时间:2014-04-08 05:41:31

标签: c++

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

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 */

4 个答案:

答案 0 :(得分:4)

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

第一件事,链接到C ++编译器,实际上在Visual Studio中是非常可行的,例如,确实有用于编译C ++的DLL库以及吐出可以在运行时链接的新DLL。

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

使用动态链接加载程序(仅限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。不要将其复制粘贴到生产代码中,因为它没有错误检查。

答案 3 :(得分:0)

适合我:

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");