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

时间:2017-12-23 15:45:30

标签: c++ runtime clang function-pointers

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

  1. Can Clang可以运行从字符串中提取的代码(从磁盘加载)吗?

  2. 编译的Clang函数是否可以用指向它的函数指针表示?

  3. 有什么想法吗?

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:3)

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

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

更好的解决方案是使用口译员。 JavaScript和Lisp都带有一个eval()函数,它完全符合你的需要 - 它需要一个字符串(在JavaScript的情况下)或一个列表(在Lisp的情况下),执行它作为代码< / em>的

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