【问题标题】:"Evaluate function" in C++C ++中的“评估函数”
【发布时间】:2011-05-19 16:57:21
【问题描述】:

我想知道 C++ 中是否存在类似 Matlab 的“评估”函数。

在实践中,我需要一个可以像命令行一样解释字符串的函数。

感谢您的回答。

【问题讨论】:

  • 嗨,Cavs85!欢迎来到堆栈溢出。如果您可以包含指向 Matlab 的 evaluate 函数的文档的链接,将会很有帮助。由于我不知道它是做什么的,所以我无法告诉你它是什么 C++ 函数。
  • eval(expression) "执行 表达式,一个包含任何有效 MATLAB 表达式的字符串。"您想要一个可以执行任意 MATLAB 表达式的 C++ 函数吗?还是您想要一个可以执行任意 C++ 表达式的 C++ 函数?还是别的什么?
  • 这听起来像是一个“XY 问题”mywiki.wooledge.org/XyProblem。 @Cavs85,请描述你的最终目标,而不仅仅是你坚持的目标。

标签: c++ visual-studio-2008 string function evaluation


【解决方案1】:

如果您实际上是在尝试在正在运行的 C++ 应用程序中“评估”C++ 源代码,那么基本上不会 - 这不是语言指定的功能。

对于 C++ 的子集(例如 CInt、Ch 和 UnderC)有 解释器 - 如果它是一个相对简单的 C++ 程序,它们可能能够运行您的 C++ 程序。或者,一些可以嵌入到已编译的 C++ 程序中以允许一些运行时源代码评估,但访问和更改预编译代码及其变量的能力有限。

运行中的程序也可以调用编译器并动态加载/链接生成的库,但这是一种非常不寻常的做法,并非没有性能、安全性和互操作性问题:

  • 为编译器创建一个新进程,编译和链接是一项相对消耗资源且速度较慢的操作,但一旦链接库,新代码就可以以正常的外线函数调用速度执行
  • 执行外部进程的常见问题
    • 确保程序的恶意输入不会更改路径和编译器可执行文件名称
    • 没有恶意软件替代或感染编译器
    • 动态源代码不包含 system()exec()unlink() 调用、滥用网络连接、咀嚼无根据的 CPU/内存/描述符等语句。
  • 预编译的 C++ 程序不能被新链接的代码修改或轻松/深入探测,因此新行为的主要机制必须已经设计到预编译的应用程序中:对新可访问变量的期望、函数和工厂方法/虚拟调度。

如果您确实需要更有限的东西,例如评估数学表达式或逻辑谓词的能力,可能以 C++ 源代码风格表达,可能读取或设置您的一些值,然后还有更多有限和专门的库和嵌入式解释可用。甚至还有用于创建此类解析器的库,例如 boost spirit 库。

最后,其他语言(Lua、Ruby、Python、Perl、TCL 等)的解释器可以嵌入到 C++ 应用程序中,采用各种方法来实现互操作性和安全性。

【讨论】:

    【解决方案2】:

    你可以使用system():http://linux.die.net/man/3/system

    【讨论】:

    • 这会让你调用一些提供eval风格函数的其他程序,我们不要将它与标准C++表达式求值器混淆。
    • system() 在 Windows 上也可用吗? Q 提到了visual studio
    • @Ben,因为 OP 要求“一个可以像命令行一样解释字符串的函数”,所以我使用了system()。你是对的,它不等同于 Matlab 的eval
    • +1:虽然这可能不是 OP 想要的,但肯定是他要求的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2015-12-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多