【问题标题】:How to run c++ code from c++?如何从 c++ 运行 c++ 代码?
【发布时间】:2013-05-11 03:01:37
【问题描述】:

如果我在 c++ 程序中有一些 c++ 代码作为字符串数量(数据),我可以执行该字符串的内容吗?

就像使用 C# 中的 CodeDOM 或 perl、python 等中的 eval 函数一样。

【问题讨论】:

  • 这是一个很奇怪的问题。
  • 也许你应该添加更多关于你想要回答的细节?
  • 这是一个非常愚蠢的问题或一个有趣的笑话。
  • 我的意思是你有一个字符串,你可以编译它,就像 C# 中的 CodeDom
  • 乍得,如果您花时间拼出“您”和亲属,人们会更加重视您。输入“u”让我们觉得您没有为您的问题付出任何努力,而且没有人愿意回答。

标签: c++ reflection


【解决方案1】:

简答:你不能。

稍微长一点的回答:c++没有反射,一般都是编译的,所以不支持这种东西,也不能随便添加..

变通方法:

  1. 将 [python|tcl|ruby|...] 之类的可嵌入动态语言与您的 c++ 代码结合使用。现在您需要在数据中包含动态语言(而不是 c++)。
  2. 使用 c++ 解释器,如 cint 或 ch.这会将您绑定到解释器。
  3. 使用系统 c++ 编译器从您的代码构建动态库并即时链接到它。有风险且依赖于系统。
  4. 使用不同的语言。

【讨论】:

    【解决方案2】:

    没有。由于 C++ 是一种静态语言,您不能动态评估任意代码。

    您可以按照 Keith 的建议对其进行解释,甚至单独编译和运行它

    【讨论】:

    • 这个答案没有任何意义。 “你不能动态评估”但“你可以解释”——这应该是什么意思?哦,当然你可以为 C++ 表达式编写一个评估器,甚至是一个成熟的 C++ 解释器……只是没有一个功能齐全的预制。
    【解决方案3】:

    如果您的意思是即时编译 C++ 代码并运行它?确定您是否有可用的编译器

    【讨论】:

    • 我的意思是你有一个字符串,你可以编译它,就像 C# 中的 CodeDom
    • 这是我能想象到的最接近的做法,编译代码并动态链接新的 DLL。不过,这几乎不是很安全。
    • C++ 没有像 C# 那样的内置反射功能,所以无论如何都会非常困难。
    • 我根本看不出“反射能力”与它有什么关系。理想情况下,您将获取 C++ 代码,在内存中对其进行编译,并获取指向其 main(或您选择的任何其他导出符号)的指针。 Tiny C Compiler 正是为 C 做的。它对 C++ 肯定是可行的,只是复杂,到目前为止没有人打扰。我想如果你真的努力,你可以从 g++ 中提取所有必要的东西(除了命令行二进制文件),然后使用它。
    • @Pavel - 反射与从主应用程序访问变量有关。当然,必须明确指定什么是可访问的,以及如何是一个非常的好主意,但你必须承认(并且已经这样做了)——这并不像使用某些脚本语言那样简单,请利用-this-gaping-security-hole 解决方案。
    【解决方案4】:

    没有一个主流的 C++ 实现具有该功能,因为 C++ 没有反射性。

    不过,看看 Ch,它可能就是你要找的东西:

    http://www.softintegration.com/

    http://en.wikipedia.org/wiki/Ch_interpreter

    您可以将 Ch 解释器嵌入到您的 C++ 应用程序中,并在其中运行动态 C++ 代码。

    【讨论】:

    • 如果您不必嵌入 C++,我建议您考虑嵌入 lua 或 python - 两者都非常容易与 C++ 集成。
    【解决方案5】:

    C++ 无法做到这一点 - 编译后的程序不知道源语言语法、标识符名称等。

    即使您努力将字符串写入文件、调用 c++ 编译器以生成动态库并加载和调用它,该调用也不会对您的程序有任何了解——它不会能够引用您的变量等。

    想要这样做的最常见原因是能够从字符串中评估表达式。从头开始编写代码来做到这一点绝对不是微不足道的,但根据您的具体要求,您应该能够找到一个库或可嵌入的脚本语言来大致完成您需要的工作。

    在快速谷歌之后,我发现this - C 而不是 C++,我不知道它有多好。它是作为我没有听说过的解析器生成器的演示编写的。您可能会发现替代品作为更知名的解析器生成器的演示,例如 yacc、bison、yacc++ 或 antlr。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      相关资源
      最近更新 更多