在C++中可以通过字符串变量执行C++代码。 就像在Javascript:从字符串变量执行C++
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
我想非常类似如Javascript在C++的东西。怎么做 ?
在C++中可以通过字符串变量执行C++代码。 就像在Javascript:从字符串变量执行C++
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
我想非常类似如Javascript在C++的东西。怎么做 ?
您将需要调用编译器来编译代码。另外,您需要生成一些代码来将该字符串包装在函数声明中。最后,你会以某种方式加载编译后的代码。
如果我这样做(我将不)我将:
system()
)建立一个编译器共享 库(.dll
上windows或.so
在Linux上)在大多数情况下,这实际上不是您想要编写C代码的方式。
这听起来像是一个计划,我很感兴趣。你可以带一个简单的Windows例子吗? – Jigberto 2013-04-05 19:17:10
@Jigberto:你显然没有在这里找到答案的基本含义。这并不简单,因为这不是C++的意义所在。如果你问一个简单的例子,你不应该对这个“计划”“感兴趣”。 – DevSolar 2013-04-05 19:20:12
@DevSola好了,答案符合我的需求:)所以我很乐意让它变得更真实。我知道C++并不是这样设计的,但我们对事物没有限制,而且我们总能找到解决方法。我喜欢这个答案,以及由Luchian Grigore发布的答案。 – Jigberto 2013-04-05 19:26:22
直接,没有。但您可以:
C++是编译的语言。您将C++源代码编译为机器代码,即可执行文件。这是加载和执行。编译器知道C++(并且具有所有可用的库头文件)。可执行文件没有,这就是为什么它不能将字符串转换为可执行代码。你可以,事实上,执行字符串的内容,如果它恰好包含机器代码指令,但是这通常是一个非常糟糕的主意......
这并不意味着它不会是可能做这种运行时编译。在C++中很少(如果确实是任何东西)是不可能的。但是你要做的是实现一个C++编译器对象......在决定你真的需要这个之前,先看看其他编译器项目。
解释语言可以轻松地做到这一点 - 他们只需要将字符串传递给已经运行程序的解释器。他们在其他方面支付了这种灵活性。
简短的回答是没有。黑客将有一个现场日。但是,您可以使用Windows IActiveScriptSite接口来利用Java/VB脚本。 Google IActiveScriptSite,网上有很多例子。或者你可以做我目前正在做的事情,推出你自己的脚本引擎。
不,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;)
您忘记了LuaJIT,如果不是已经存在的话,LuaJIT将会成为最快的 – 2013-04-05 19:15:23
@ W.B。是的,LuaJIT看起来相当快。希望有与其他语言的头对头比较,但他们网站上的基准只与Lua相比。 – dtech 2013-04-05 19:21:34
没有。不是。您必须将整个C++编译器复合体嵌入到您的应用程序中,以便进行远程操作。 – 2013-04-05 19:02:27
如果您想要嵌入式脚本语言,请考虑Lua。 – 2013-04-05 19:04:39
@jrok:当然是。实际上,我过去做过这样的事情(对于我来说,一种用于较老光线追踪器的软件着色器实现)。唯一的“魔术”是调用编译器。 – 2013-04-05 19:24:19