# 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 类型 ### 改动点 1. `release/inc/myIcp67.h`: 添加 `extern "C"` 包裹,`bool test;` → `uint8_t test;` 2. `src/protocol/libicp67/src/icp67.cpp`: `bool test` → `uint8_t test`(同步修改所有引用) ### 难度: 低 --- ## P1: libcmd — 移除 C++ 默认参数 + 添加 extern "C" ### 改动点 1. `release/inc/myCmd.h`: - 移除 `= NULL` 默认参数 - 新增便捷宏供纯 C 调用方使用 - 添加 `extern "C"` 包裹 2. `src/public/libcmd/src/my_cmd.cpp`: 无改动(C++ 实现内部仍可用 STL) ### 难度: 低 --- ## P2: libcomm — enum class → C enum + std::string → char[] ### 改动点 1. `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"` 包裹 2. `src/public/libcomm/src/comm*.cpp`: 同步修改 STL string → char[] 引用 ### 难度: 中 --- ## P3: libdatacenter — 全量 STL → C 类型 ### 改动点 1. `release/inc/myDatacenter.h`: - `std::string` 参数 → `const char*` - `std::string` 返回值 → `const char*` 或 `int` + `char*` 输出参数 - `std::string &desc` → `char *desc, int desc_len` - `std::vector*` → `void **, int *count` - `std::vector` → `char **, int *count` 或定长数组 - 结构体 `std::string` 成员 → `char xxx[N]` 定长数组 - 回调签名中 `std::string` → `const char*` - 移除 ` ` include - 添加 `extern "C"` 包裹 2. `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) 对外使用不透明指针: ```c 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); ``` ### 难度: 中