如何快速将C语言多级指定初始化列表转换为C++合法写法
C风格指定初始化列表转C++兼容写法解决方案
方案1:最简方案(推荐,无需修改业务代码)
C20标准已正式支持C风格的指定初始化语法,你只需要在编译选项中开启C20支持即可:
- GCC/Clang 新增编译参数
-std=c++20 - MSVC 新增编译参数
/std:c++20
注意:C++标准要求指定初始化的字段顺序必须和结构体定义的顺序完全一致,C语言无此限制。如果你的代码中存在顺序不匹配的情况,调整字段顺序即可,绝大多数原有C代码的初始化顺序都和结构体定义一致,直接开启编译参数即可编译通过。
方案2:兼容C11~C17旧标准的写法
如果项目必须使用旧C++标准,可选择以下两种快速转换方式:
方式A:嵌套聚合初始化
直接去掉.字段名标识,严格按照结构体定义的字段顺序填充值即可,你的示例转换后代码如下:
wifi_config_t wifi_config = { { // 对应sta字段的结构体,按声明顺序填充内部字段 EXAMPLE_ESP_WIFI_SSID, // ssid字段 EXAMPLE_ESP_WIFI_PASS, // password字段 { WIFI_AUTH_WPA2_PSK }, // threshold结构体,第一个字段为authmode { true, false } // pmf_cfg结构体,按顺序填capable、required } };
方式B:分步赋值(可读性最高,适合批量转换)
如果结构嵌套层级深、字段多,担心填错顺序,可直接拆分成分步赋值,转换后代码如下:
wifi_config_t wifi_config = {}; // 先零初始化整个结构体 wifi_config.sta.ssid = EXAMPLE_ESP_WIFI_SSID; wifi_config.sta.password = EXAMPLE_ESP_WIFI_PASS; wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; wifi_config.sta.pmf_cfg.capable = true; wifi_config.sta.pmf_cfg.required = false;
该方式不需要关心结构体字段声明顺序,可直接对应原有指定初始化的字段名编写,批量转换时可以用正则脚本批量替换,转换效率很高。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

