持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
C语言开发过程中,C++会提供很多工具包,但是C++是面向对象编程,如何使用这些C++工具包。
本文章以实际项目中使用到的github上一个C++编写的优雅报表 PrerryTable 生成报表文件,实验环境为 RHEL7,介绍C调用C++方案,提供源代码供参考,使您后续开发应用程序能够参考使用。
主要方案是将C++的动态库封装一层,采用C语言封装C++中的类进行实现
编写wrapper代码,包装 PrettyTable 的创建和释放,以及 PrettyTable 的成员函数。
/* wrapper.h */
#ifndef WRAPPER_H_
#define WRAPPER_H_
#ifdef __cplusplus
extern "C"
{
#endif
void *call_PrettyTable_Create(char *);
void call_PrettyTable_Destroy(void *);
void call_PrettyTable_addRow(void *, char *);
void call_PrettyTable_showTable(void *, FILE *fp);
#ifdef __cplusplus
}
#endif
#endif // WRAPPER_H_
/* wrapper.c */
#include "PrettyTable.h"
#include "wrapper.h"
using namespace std;
void *call_PrettyTable_Create(char *str) {
return new PrettyTable(str);
}
void call_PrettyTable_Destroy(void *p) {
delete static_cast<PrettyTable *>(p);
}
void call_PrettyTable_addRow(void *p, char *str) {
return static_cast<PrettyTable *>(p)->addRow(str);
}
void call_PrettyTable_showTable(void *p, FILE *fp) {
return static_cast<PrettyTable *>(p)->showTable(fp);
}
在 main.c 中调用 PrettyTable 的方法:
/* main.c */
#include <stdio.h>
#include "wrapper.h"
int main() {
char *str = "{task_id|content|begin_date|end_date|status|remark|}";
char *str1 = "{task_id1|content1|begin_date1|end_date1||remark1|score1|}";
char *str2 = "{task_id22|content22|begin_date22|end_date22|status22|remark22|score22||}";
char *str3 = "{task_id333|content333|begin_date333|end_date333|status333|remark333|score333}";
FILE *fp;
fp = fopen("PTable.txt", "w");
fprintf(fp, " PrettyTalbe \n");
fprintf(fp, "\n");
void *p = call_PrettyTable_Create(str);
call_PrettyTable_addRow(p, str1);
call_PrettyTable_addRow(p, str2);
call_PrettyTable_addRow(p, str3);
call_PrettyTable_showTable(p, fp);
call_PrettyTable_Destroy(p);
编译方法
为方便后续开发,在study用户下建立PrettyTable目录,并将github下载的 PrerryTable 包放入
并编写wrapper封装程序,以及测试用的main程序
# 建立开发目录
mkdir /home/study/PrettyTable
cd /home/study/PrettyTable
# 应保证存在以下文件
PrettyTable.h
PrettyTable.cpp
wrapper.h
wrapper.cpp
main.c
# 对wrapper进行编译,生成测试libtest动态库
g++ -shared -o libtest.so wrapper.cpp PrettyTable.cpp
#经过编译后会在本目录下生成libtest.so的动态库,后续可在自己开发应用中引用该so库
libtest.so
# 对main进行编译,生成测试可执行程序
gcc main.c -o main -ltest -L./ -I .
运行方法
cd /home/study/PrettyTable
./main
# 执行后将生成 PTable.txt 报表文件
PTable.txt
输出结果
vi PTable.txt
# 文件内容显示如下
PrettyTalbe
+------------+------------+---------------+-------------+-----------+-----------+
| task_id | content | begin_date | end_date | status | remark |
+------------+------------+---------------+-------------+-----------+-----------+
| task_id1 | content1 | begin_date1 | end_date1 | | remark1 |
+------------+------------+---------------+-------------+-----------+-----------+
| task_id22 | content22 | begin_date22 | end_date22 | status22 | remark22 |
+------------+------------+---------------+-------------+-----------+-----------+
| task_id333 | content333 | begin_date333 | end_date333 | status333 | remark333 |
+------------+------------+---------------+-------------+-----------+-----------+