一、简介
之前写了一篇c++ 调用python的方式实现表达式计算 ,但在项目应用中发现单线程没问题,多个线程时偶尔会闪退崩溃。后面发现了一个C++代码编写的表达式计算工具ExprTK, 也能同样满足需求,在此分享给大家。c++数学表达式库(ExprTk)是一个使用简单,易于集成和运行极其高效的数学表达式解析器和求值引擎。ExprTk支持多种形式的函数式、逻辑和向量处理语义,并且非常容易扩展。
ExprTK原文地址:http://www.partow.net/programming/exprtk/index.html
下载地址 http://www.partow.net/downloads/exprtk.zip
二、功能
ExprTk 库具有以下功能:
-
数学运算符 :(+, -, *, /, %, ^)
-
函数(min, max, avg, sum, abs, ceil, floor, round, roundn, exp, log, log10, logn, pow, root, sqrt, clamp, inrange, swap)
-
三角函数(sin, cos, tan, acos, asin, atan, atan2, cosh, cot, csc, sec, sinh, tanh, d2r, r2d, d2g, g2d, hyp)
-
平等与不平等 (=, ==, <>, !=, <, <=, >, >=)
-
赋值 (:=, +=, -=, *=, /=, %=)
-
逻辑运算符(and, nand, nor, not, or, xor, xnor, mand, mor)
-
控制结构(if-then-else、三目运算、switch case、返回语句)
-
循环结构(while循环,for循环,repeat until loop, break, continue)
-
表达式优化(常数折叠、强度降低、运算符耦合、特殊函数和死代码消除)
-
字符串操作(等式、不等式、逻辑运算符、连接和子范围)
-
表达式局部变量、向量和字符串
-
用户定义的变量、向量、字符串、常量和函数支持
-
多元函数组合
-
支持多序列点和子表达式
-
数字积分和微分
-
向量处理:BLAS-L1 (axpy, axpby, axpb), all/any-true/false,计数,左/右旋转,左/右移位,排序,nth_element, iota, sum, kahan-sum,点积,复制
-
文件- io包(例程包括:open, close, read, write, getline,支持二进制和文本模式)
-
支持各种数值类型(float, double, long double、MPFR/GMP)
-
只有单个头文件实现,不需要构建。没有外部依赖。
-
完全可移植(编译和执行:x86 x86-64,ARMv7 / 8,POWER6 / 7和AVR32)
三、使用示例
环境:qt creator + msvc2015
新建一个qt工程,添加exprtk.hpp文件,只需要在您的源代码中包含“exprtk.hpp”即可
此时会编译失败,提示如下:
xxx\exprtk.hpp(15376) : fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
在pro文件中添加一句话即可,重新qmake一下
win32:QMAKE_CXXFLAGS += /bigobj
示例代码如下:
#include <QDebug>
#include <cstdio>
#include <string>
#include "exprtk.hpp"typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;double evalcpp(const QString &expr)
{expression_t expression;parser_t parser;parser.compile(expr.toStdString(), expression);double val = expression.value();return val;
}int main()
{qDebug() << evalcpp("1+1");return 0;
}