14

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

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

var F=new Function (theInstructions);

return(F());

我想要一些非常相似的东西,比如 C++ 中的 Javascript。怎么做 ?

4

6 回答 6

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

于 2013-04-05T19:08:05.790 回答
10

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

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

  1. 在代码周围连接一个标准包装函数头
  2. 通过命令行 ( ) 调用编译器system()来构建共享库(.dll在 windows 或.solinux 上)
  3. 加载共享库并映射函数
  4. 调用函数

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

于 2013-04-05T19:07:14.563 回答
6

直接说不行。但是你可以:

  • 将该字符串写入文件。
  • 调用编译器并编译该文件。
  • 执行生成的二进制文件。
于 2013-04-05T19:06:31.590 回答
5

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

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

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

于 2013-04-05T19:06:58.973 回答
1

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

我创建了小型 CMake 项目以便于 Cling 集成:C++ 作为编译时脚本语言 ( https://github.com/derofim/cling-cmake )

于 2019-09-16T10:43:32.737 回答
0

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

于 2013-04-05T19:07:14.813 回答