3.5 KiB
3.5 KiB
public/protocol 模块 C 接口化改造方案
背景
开发团队要求 src/public/ 和 src/protocol/ 下所有模块提供纯 C 接口(头文件可被 C 编译器解析)。
当前除 lib60870 外,逐一排查后发现有 5 个模块不符合要求。
检查结果汇总
| 模块 | 目录 | C接口? | 主要问题 |
|---|---|---|---|
| libcJSON | public | ✅ | — |
| libfunc | public | ✅ | — |
| libmd5 | public | ✅ | — |
| libmy_xxhash | public | ✅ | — |
| libtask | public | ✅ | — |
| libmy_mosquitto | public | ✅ | — |
| libmodbus | protocol | ✅ | — |
| libmongoose | protocol | ✅ | — |
| libmms_m | protocol | ✅ | 接口已是C(有extern "C") |
| libmms_s | protocol | ✅ | 接口已是C(有extern "C") |
| libicp67 | protocol | ❌ | 缺extern "C",含bool test |
| libcmd | public | ❌ | C++默认参数,无extern "C" |
| libcomm | public | ❌ | enum class + std::string |
| libdatacenter | public | ❌ | 大面积std::string/vector/map |
| libxml | public | ❌ | 第三方C++类库 |
实施优先级
P0 → P1 → P2 → P3 → P4,逐步推进,每一步完成后编译验证。
P0: libicp67 — 添加 extern "C" + 替换 bool 类型
改动点
release/inc/myIcp67.h: 添加extern "C"包裹,bool test;→uint8_t test;src/protocol/libicp67/src/icp67.cpp:bool test→uint8_t test(同步修改所有引用)
难度: 低
P1: libcmd — 移除 C++ 默认参数 + 添加 extern "C"
改动点
release/inc/myCmd.h:- 移除
= NULL默认参数 - 新增便捷宏供纯 C 调用方使用
- 添加
extern "C"包裹
- 移除
src/public/libcmd/src/my_cmd.cpp: 无改动(C++ 实现内部仍可用 STL)
难度: 低
P2: libcomm — enum class → C enum + std::string → char[]
改动点
release/inc/myComm.h:enum class CommType→typedef enum { COMM_TYPE_... } CommType;enum class CommDebugShow→typedef enum { COMM_DEBUG_... } CommDebugShow;enum class CommState→typedef enum { COMM_STATE_... } CommState;enum class CommFdType→typedef enum { COMM_FD_... } CommFdType;std::string成员 →char[]定长数组- 添加
extern "C"包裹
src/public/libcomm/src/comm*.cpp: 同步修改 STL string → char[] 引用
难度: 中
P3: libdatacenter — 全量 STL → C 类型
改动点
release/inc/myDatacenter.h:std::string参数 →const char*std::string返回值 →const char*或int+char*输出参数std::string &desc→char *desc, int desc_lenstd::vector<void*>*→void **, int *countstd::vector<std::string>→char **, int *count或定长数组- 结构体
std::string成员 →char xxx[N]定长数组 - 回调签名中
std::string→const char* - 移除
<vector> <string> <map>include - 添加
extern "C"包裹
src/public/libdatacenter/src/*.cpp: 同步修改所有调用处
难度: 高
P4: libxml (tinyxml2) — 薄 C 封装层
方案: 新建 C 封装层
新建文件:
src/public/libxml/src/xml_c_wrapper.h— C 接口声明src/public/libxml/src/xml_c_wrapper.cpp— C 封装实现(内部调用 tinyxml2)
对外使用不透明指针:
typedef struct xml_doc xml_doc;
xml_doc* xml_open(const char *filepath);
void xml_close(xml_doc *doc);
const char* xml_get_child_text(xml_doc *doc, const char *path);