如何在C++中初始化包含联合体的结构体数组?
初始化带联合体成员的结构体数组:可行方案
完全可以使用大括号初始化列表来初始化这个FilterSelect数组,以下是两种常用的实现方式:
方式一:指定初始化器(推荐,C++11及以上)
这种方式通过明确指定联合体的成员,代码可读性强,避免歧义:
FilterSelect filter_select[2] = { { FilterType::kLowPass, {.low_pass_config = FilterLowPassConfig::k1kHzLowPass} }, { FilterType::kAverage, {.average_config = FilterAverageConfig::kWindowSize256} } };
用.low_pass_config和.average_config直接指定要初始化的联合体成员,编译器会准确将枚举值赋值到对应的成员内存位置。
方式二:顺序初始化(不推荐)
如果不使用指定初始化器,也可以按结构体和联合体的成员顺序进行初始化,但这种方式可读性差,且容易因结构体/联合体成员顺序变更导致错误:
FilterSelect filter_select[2] = { {FilterType::kLowPass, {FilterLowPassConfig::k10kHzLowPass}}, {FilterType::kAverage, {static_cast<FilterLowPassConfig>(FilterAverageConfig::kWindowSize128)}} };
注意:联合体成员共享内存,顺序初始化只会赋值给联合体的第一个成员(此处为low_pass_config)。若要给average_config赋值需强制类型转换,但逻辑上不严谨——相当于把average_config的枚举值存到low_pass_config的内存中,后续读取average_config属于未定义行为,因此不建议使用这种方式。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

