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

C++ 有没有办法将字符串转换成可编译/可运行的代码?,c++,C++,例如,假设我们有一个字符串,如: string x = "for(int i = 0; i < 10; i++){cout << \"Hello World!\n\";}" 标准C++库不包含C++解析器/编译器。这意味着你唯一的选择是找到并链接一个C++编译器库或者简单地把你的字符串输出为一个文件,并用系统调用启动C++编译器。 P>第一个链接到C++编译器的东西,在VisualStudio之类的东西中是非常可行的,它确实有用于编译C++和在运行时链接一个新DLL的DLL

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

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

<>标准C++库不包含C++解析器/编译器。这意味着你唯一的选择是找到并链接一个C++编译器库或者简单地把你的字符串输出为一个文件,并用系统调用启动C++编译器。 <> P>第一个链接到C++编译器的东西,在VisualStudio之类的东西中是非常可行的,它确实有用于编译C++和在运行时链接一个新DLL的DLL库。p> 第二件事,几乎是任何IDE所做的。它将文本编辑器的内容保存到C++文件中,通过系统执行编译器编译并运行输出。 也就是说,有许多语言具有内置解释器,更适合于运行时代码解释。

适合我:

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

<代码>系统(“ECHORE”)包含\NINT主(){for(int i=0;i<10;i++){STD::CUT< P>不直接要求C++同时编译和解释。< /P> <>但是,这是一个编译器框架,它允许你在这个例子中包含一个包含有效C++的字符串,调用LLVM基础结构,然后使用一个LLVM的即时编译器,如你所说的,你还必须支持C++库。进入解释的C++,并取出数据。

这是一项重大但有价值的任务,似乎有人已经做了类似的事情,也许就是这样。

使用动态链接加载程序(仅限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 );
}
#包括
#包括
#包括
#包括
无效do_代码(标准::字符串x){
{std::of流s(“temp.cc”);

S编译器总是这样做,但是它确实需要编译器来正确地处理它。不像其他语言(如Python、Ruby或JavaScript),这在C++中并不简单。我想,这可以在C++中以一行完成。你看到了吗?“正确的”答案可能是“不要这样做”。+ 1 -很多要点。还有C++的子集解释程序。有关于那些……我认为原始问题有一个关于它的不可移植性的含义:
#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 );
}