如何在运行时从表示函数的字符串执行C ++代码?

问题描述 投票:3回答:2

我正在开发一个项目,其中我需要能够将函数字符串保存到磁盘,所以我让用户传递一串字符,这是函数的实际代码并将其保存到磁盘。相反的情况也是必要的;加载一个字符串(从文件)并在C ++中在运行时作为函数执行。我需要加载这个函数并返回一个函数指针,以便在我的程序中使用。我现在正在看Clang,但其中一些有点过头了。所以基本上我有两个问题;

  1. Can Clang可以运行从字符串中提取的代码(从磁盘加载)吗?
  2. 编译的Clang函数可以用指向它的函数指针表示吗?

有任何想法吗?

c++ runtime clang function-pointers
2个回答
8
投票

你的问题的简单答案是“是”,稍微复杂的答案是“根本不容易”。

使用C ++执行此操作需要您将函数编译并链接到DLL /共享对象,加载它,然后获取导出的函数。此外,从用户接受此类代码将是一个可怕的安全风险

对于这样的运行时执行来说,C ++是一个非常差的选择,你会想到使用那种用于该用途的语言,JavaScript或Python会更好。


3
投票

您无法使用编译语言轻松完成此操作。

对于已编译的程序来执行已在运行时动态提供的C ++函数,该函数需要自行编译。您可以让程序在运行时调用编译器来生成可调用库(例如,实现接口或抽象类并可通过依赖注入调用的库),但这很复杂并且本身就是一个项目。这也意味着您的应用程序必须与编译器一起打包,或者只能安装在包含兼容编译器的系统上 - 在Linux上有点现实,而在Windows上则不然。

更好的解决方案是使用口译员。 JavaScript和Lisp都带有一个eval()函数,它可以完全按照您的需要运行 - 它需要一个字符串(在JavaScript的情况下)或一个列表(在Lisp的情况下)并将其作为代码执行。

第三种可能性是找到一个具有eval()函数的C ++解释器。我不确定是否存在。你可以尝试自己写一个。

© www.soinside.com 2019 - 2024. All rights reserved.