我可以使用 C 程序中的C++模板库吗?
Can I use a C++ template library from a C program?
我对C++的了解有限。我知道只要 C 接口可用,就可以从 C 调用C++库。是否可以从 C 库调用.hpp
文件中定义的C++模板库?例如,这个精彩的表达式评估库。
也许是时候学习C++了!还行。这是第一次尝试:
#ifndef EXPRTK_C_H_
#define EXPRTK_C_H_
#include "exprtk.hpp"
//Header
#ifdef __cplusplus
extern "C" {
#endif
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
void add_variable_(symbol_table_t st, char* name, double *value);
void register_symbol_table_(expression_t ex, symbol_table_t st);
void compile_(parser_t parser, char *expression_string, expression_t ex);
double evaluate_(expression_t ex);
#ifdef __cplusplus
}
#endif
#endif /* EXPRTK_C_H_ */
#include "exprtk.hpp"
#include "exprtk_c.hpp"
这是.cpp文件。 trig_function()
是真实的例子,用于main()
.接下来是我包装函数的尝试。错误消息与解析器有关。
exprtk.hpp:16962:7: error: ‘exprtk::parser<T>::parser(const exprtk::parser<T>&) [with T = double]’ is private
exprtk_simple_example_01.cpp:85:83: error: within this context
exprtk_simple_example_01.cpp:60:6: error: initializing argument 1 of ‘void compile_(parser_t, char*, expression_t)’
template<typename T>
void trig_function() {
std::string expression_string =
"clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
T x;
exprtk::symbol_table<T> symbol_table;
symbol_table.add_variable("x", x);
symbol_table.add_constants();
exprtk::expression<T> expression;
expression.register_symbol_table(symbol_table);
exprtk::parser<T> parser;
parser.compile(expression_string, expression);
for (x = T(-5.0); x <= T(+5.0); x += 0.001) {
T y = expression.value();
printf("%19.15ft%19.15fn", x, y);
}
}
//Cpp file
void add_variable_(symbol_table_t st, char *varname, double *value) {
const std::string varname_ = varname;
bool r = st.add_variable(varname_, *value);
printf("%dn", r);
r = st.add_constants();
}
void register_symbol_table_(expression_t ex, symbol_table_t st) {
ex.register_symbol_table(st);
}
void compile_(parser_t parser,char *expression_string, expression_t ex) {
const std::string expression_string_ = expression_string;
parser.compile(expression_string_, ex);
}
double evaluate_(expression_t ex) {
double val = ex.value();
return (val);
}
int main() {
trig_function<double>();
double x;
//exprtk::symbol_table<double> symbol_table;
symbol_table_t symbol_table;
add_variable_(symbol_table, "x", &x);
symbol_table.add_constants();
//exprtk::expression<double> expression;
expression_t expression;
register_symbol_table_(expression, symbol_table);
//exprtk::parser<double> parser;
parser_t parser;
compile_(parser, "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)", expression);
double q = -5.0, y = 0.0;
for (x = q; x <= +5.0; x += 0.001) {
y = evaluate_(expression);
printf("%19.15ft%19.15fn", x, y);
}
return (0);
}
一定要学C++。
您可以将模板隐藏在 cpp 文件中,并公开一个接口来使用它们:
//Header
#ifdef __cplusplus
extern "C" {
#endif
void push(int elt);
int pop();
#ifdef __cplusplus
}
#endif
//Cpp file
static std::deque<int> queue;
void push(int elt) {
queue.push_back(elt);
}
int pop() {
auto tmp = queue.front();
queue.pop_front();
return tmp;
}
不能通过 C 实例化模板,但可以使用在后台利用模板并将所有内容链接在一起的头文件。也就是说,我强烈建议过去离开 C,并学习C++;它提供更多的动力、速度和安全性。
No.
C不支持模板,因此没有 C 接口可用。
相关文章:
- 是否可以使C++类成为Objc类的委托
- 是否可以使一个类成为两个不同层次结构的子类?
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 可以使未命名的结构静态
- 是否可以使整数仅收到一个单个数字而不是两个接收输入
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 是否可以使 std 容器使用默认运算符为新?
- LD_BIND_NOW可以使可执行文件运行得更慢?
- 是否可以使头文件使文本居中?- 在控制台中
- 有什么方法可以使核心忙碌等待
- 有没有一种技术可以使虚函数在所有派生类中强制重写?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 编写一个可以使二维数组平坦的函数
- 有哪些优化技巧可以使我的代码运行得更快
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 如果必须在同一向量上写入线程,是否可以使用线程
- 对于具有两个模板化变量的模板化类,是否可以使一个 var 引用另一个 var
- C 中的内容可以使Windows 8应用程序不在手臂上运行