为何C++结构体列表初始化无法兼容char数组?
无需构造函数的结构体大括号初始化方案
首先要明确:你的结构体因为定义了自定义构造函数,已经不属于C++的聚合类型,因此无法使用聚合初始化(直接大括号赋值)。要不用构造函数实现初始化,首先需要移除自定义构造函数,让结构体恢复为聚合类型,再针对char数组的情况选择对应写法:
方案1:用字符串字面量直接初始化(最简单)
移除构造函数后,直接用字符串字面量给stateName成员赋值,完全兼容大括号初始化:
#include <cstdint> using namespace std; struct NamedLocationData { uint16_t offset; char stateName[21]; float lat; float lon; uint32_t population; }; int main() { uint16_t nameOffset = 0; float lat = 40; float lon = -74; uint32_t population = 8000000; // 直接用字符串字面量初始化,完美兼容 NamedLocationData temp = {nameOffset, "New York", lat, lon, population}; }
方案2:用已有char数组变量初始化
如果必须用已有的char数组变量(比如你的代码里的stateName),原始C风格数组无法直接通过聚合初始化赋值(数组会退化为指针,无法匹配char数组成员),可以选以下两种方式:
方式A:初始化后手动拷贝数组内容
#include <cstdint> #include <cstring> #include <algorithm> using namespace std; struct NamedLocationData { uint16_t offset; char stateName[21]; float lat; float lon; uint32_t population; }; int main() { uint16_t nameOffset = 0; char stateName[21] = "New York"; float lat = 40; float lon = -74; uint32_t population = 8000000; // 先初始化结构体,再拷贝数组内容 NamedLocationData temp = {nameOffset, {}, lat, lon, population}; // 空大括号初始化stateName std::copy(std::begin(stateName), std::end(stateName), std::begin(temp.stateName)); // 也可以用strncpy:strncpy(temp.stateName, stateName, sizeof(temp.stateName)); }
方式B:改用std::array替代C风格数组
把结构体里的char stateName[21]替换为std::array<char, 21>,这样可以直接用已有数组变量进行聚合初始化,无需额外拷贝:
#include <cstdint> #include <cstring> #include <array> using namespace std; struct NamedLocationData { uint16_t offset; std::array<char, 21> stateName; float lat; float lon; uint32_t population; }; int main() { uint16_t nameOffset = 0; std::array<char, 21> stateName{}; strncpy(stateName.data(), "New York", stateName.size()); float lat = 40; float lon = -74; uint32_t population = 8000000; // 直接用std::array变量进行大括号初始化 NamedLocationData temp = {nameOffset, stateName, lat, lon, population}; }
内容的提问来源于stack exchange,提问作者Dov
相关产品推荐
相关产品推荐

