2013-04-05 86 views
8

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

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

var F=new Function (theInstructions); 

return(F()); 

我想非常类似如Javascript在C++的东西。怎么做 ?

+0

没有。不是。您必须将整个C++编译器复合体嵌入到您的应用程序中,以便进行远程操作。 – 2013-04-05 19:02:27

+3

如果您想要嵌入式脚本语言,请考虑Lua。 – 2013-04-05 19:04:39

+0

@jrok:当然是。实际上,我过去做过这样的事情(对于我来说,一种用于较老光线追踪器的软件着色器实现)。唯一的“魔术”是调用编译器。 – 2013-04-05 19:24:19

回答

7

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

如果我这样做(我将)我将:

  1. 串联围绕代码的标准包装函数头
  2. 调用通过命令行(system())建立一个编译器共享 库(.dll上windows或.so在Linux上)
  3. 加载共享库和映射函数
  4. Invok e功能

在大多数情况下,这实际上不是您想要编写C代码的方式。

+0

这听起来像是一个计划,我很感兴趣。你可以带一个简单的Windows例子吗? – Jigberto 2013-04-05 19:17:10

+3

@Jigberto:你显然没有在这里找到答案的基本含义。这并不简单,因为这不是C++的意义所在。如果你问一个简单的例子,你不应该对这个“计划”“感兴趣”。 – DevSolar 2013-04-05 19:20:12

+0

@DevSola好了,答案符合我的需求:)所以我很乐意让它变得更真实。我知道C++并不是这样设计的,但我们对事物没有限制,而且我们总能找到解决方法。我喜欢这个答案,以及由Luchian Grigore发布的答案。 – Jigberto 2013-04-05 19:26:22

5

直接,没有。但您可以:

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

C++是编译的语言。您将C++源代码编译为机器代码,即可执行文件。这是加载和执行。编译器知道C++(并且具有所有可用的库头文件)。可执行文件没有,这就是为什么它不能将字符串转换为可执行代码。你可以,事实上,执行字符串的内容,如果它恰好包含机器代码指令,但是这通常是一个非常糟糕的主意......

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

解释语言可以轻松地做到这一点 - 他们只需要将字符串传递给已经运行程序的解释器。他们在其他方面支付了这种灵活性。

0

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

8

不,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;)

+0

您忘记了LuaJIT,如果不是已经存在的话,LuaJIT将会成为最快的 – 2013-04-05 19:15:23

+0

@ W.B。是的,LuaJIT看起来相当快。希望有与其他语言的头对头比较,但他们网站上的基准只与Lua相比。 – dtech 2013-04-05 19:21:34