在C ++中可以从字符串变量执行C ++代码。 就像在Javascript中一样:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
我想要像C ++中的Javascript一样非常相似的东西。怎么做?
答案 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)
您需要调用编译器来编译代码。此外,您需要生成一些代码以将字符串包装在函数声明中。最后,您将以某种方式加载已编译的代码。
如果我这样做(我会不),我会:
system()
)调用编译器来构建共享
库(Windows上为.dll
或Linux上为.so
)在大多数情况下,这实际上不是您想要编写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)