繁体   English   中英

在运行时定义C ++函数

[英]Define C++ function at runtime

我正在尝试调整我编写的一些数学代码以允许任意函数,但我似乎只能通过在编译时预先定义它们来实现,这似乎很笨拙。 我目前正在使用函数指针,但据我所知,仿函数会出现同样的问题。 为了提供一个简单的例子,对于前向差分,使用的代码是:

double xsquared(double x) {
    return x*x;
}

double expx(double x) {
    return exp(x);
}

double forward(double x, double h, double (*af)(double)) {
    double answer = (af(x+h)-af(x))/h;

    return answer;  
}

前两个函数中的任何一个都可以作为第三个参数传递。 但是,我想要做的是传递用户输入(在有效的C ++中),而不是事先设置功能。 任何帮助将不胜感激!

从历史上看,C ++中没有提供您要求的功能。 通常的解决方法是为C ++以外的语言嵌入解释器(例如,Lua和Python专门用于集成到C / C ++应用程序中以允许脚本编写),或者使用您的应用程序创建特定于您的应用程序的新语言。自己的解析器,编译器等。然而,这正在改变。

Clang是一个新的开源编译器,由Apple开发,利用LLVM。 Clang从一开始就设计为不仅可以用作编译器,还可以用作可以嵌入到应用程序中的C ++库。 我自己没有尝试过,但是你应该能够用Clang做你想做的事 - 你将它作为一个库链接,并要求它将用户输入的代码编译到应用程序中。

您可以尝试查看ClamAV团队已经如何做到这一点,以便可以用C语言编写新的病毒定义

至于其他编译器,我知道GCC最近增加了对插件的支持。 也许可以利用它来桥接GCC和你的应用程序,但由于GCC不是设计用于从一开始就用作库,因此可能更难。 我不知道任何其他具有相似能力的编译器。

由于C ++是一种完全编译的语言,除非您编写自己的编译器或解释器,否则无法将用户输入转换为代码。 但是在这个例子中,可以为域特定语言构建一个简单的解释器,它将是数学公式。 一切都取决于你想做什么。

您始终可以获取用户的输入并通过编译器运行它,然后执行生成的二进制文件。 这当然会带来安全风险,因为它们可以执行任意代码。

可能更容易设计一种简约语言,让用户定义简单的函数,用C ++解析它们以执行正确的代码。

最好的解决方案是使用嵌入式语言(如lua或python)来完成此类任务。 请参阅例如选择嵌入式语言以获取建议。

虽然看起来像是一个吹嘘,但是有很多人为c ++和c编写了方程解析器和解释器,许多商业,许多有缺陷,并且与人群中的面孔不同。 一个开始的地方是大学的家伙写中缀到postfix翻译。 其中一些系统使用paranthetical分组,然后将项目放在堆栈中,就像在旧的HP STL库中找到的那样。 我花了30秒钟发现了这个:

http://www.speqmath.com/tutorials/expression_parser_cpp/index.html

可能的搜索字符串:“gcc'方程解析器'中缀到后缀'

与其他语言(如Perl)不同,C ++无法对其自身进行运行时解释。

这里唯一的选择是允许用户编译可在运行时由应用程序动态加载的小型共享库。

嗯,你可以做两件事:

  1. 充分利用boost / C ++ 0x lambda并在运行时定义函数。

  2. 如果只需要数学公式,那么像muParser这样的库被设计为将字符串转换为字节码,这可以看作是在运行时定义一个函数。

您可以使用tiny C编译器作为库(libtcc)。

它允许您在运行时编译任意代码并加载它,但它只适用于C而不是C ++。

一般来说,唯一的方法是:

  • 将代码传递给编译器并创建共享对象或DLL
  • 加载此共享对象或DLL
  • 使用此共享对象中的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM