从String变量执行C ++

时间:2013-04-05 19:01:30

标签: c++

在C ++中可以从字符串变量执行C ++代码。 就像在Javascript中一样:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

我想要像C ++中的Javascript一样非常相似的东西。怎么做?

6 个答案:

答案 0 :(得分:12)

不,C ++是一种静态类型,编译为本机二进制语言。

虽然您可以使用LLVM JIT编译,但可以在不中断运行时的情况下进行编译和链接。应该是可行的,但它不在C ++领域。

如果你想在C ++下使用脚本引擎,你可以使用例如JS - 它是迄今为止最快的动态解决方案。 Lua,Python,Ruby也可以,但通常速度较慢,考虑到你只是用它来编写脚本,这可能不是一件很糟糕的事情。

例如,在Qt中,您可以执行以下操作:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QScriptEngine engine;
    QScriptValue value = engine.evaluate("var a = 20; var b = 30; a + b");

    cout << value.toNumber();

    return a.exec();
}

你会得到50;)

答案 1 :(得分:8)

您需要调用编译器来编译代码。此外,您需要生成一些代码以将字符串包装在函数声明中。最后,您将以某种方式加载已编译的代码。

如果我这样做(我会),我会:

  1. 在代码
  2. 周围连接标准包装函数头
  3. 通过命令行(system())调用编译器来构建共享 库(Windows上为.dll或Linux上为.so
  4. 加载共享库并映射函数
  5. 调用函数
  6. 在大多数情况下,这实际上不是您想要编写C代码的方式。

答案 2 :(得分:6)

直接,没有。但你可以:

  • 将该字符串写入文件。
  • 调用编译器并编译该文件。
  • 执行生成的二进制文件。

答案 3 :(得分:4)

C ++是一种编译的语言。您将C ++源代码编译为机器代码,即可执行文件。那是加载并执行的。编译器知道C ++(并且所有库头都可用)。可执行文件没有,这就是它无法将字符串转换为可执行代码的原因。实际上,如果碰巧包含机器代码指令,你可以执行字符串的内容,但这通常是一个非常糟糕的主意......

这并不意味着它不可能可能来进行这种运行时编译。在C ++中,很少(如果确实是任何事情)是不可能的。但是你要做的就是实现一个C ++编译器对象......在决定你真的想要它之前先看看其他编译器项目。

解释语言可以轻松完成此操作 - 它们只需将字符串传递给已在运行程序的解释器。他们在其他方面为这种灵活性付出了代价。

答案 4 :(得分:0)

简短的回答是否定的。黑客将有一个实地日。但是,您可以使用Windows IActiveScriptSite接口来使用Java / VB脚本。 Google IActiveScriptSite,网上有很多例子。或者你可以做我目前正在做的事情,滚动你自己的脚本引擎。

答案 5 :(得分:0)

您可以将Cling用作C ++解释器。

我创建了一个较小的CMake项目,以便更轻松地进行Cling集成:C ++作为编译时脚本语言(https://github.com/derofim/cling-cmake