C语言代码分享:C调用C++实例

343 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 |
+------------+------------+---------------+-------------+-----------+-----------+