C++编译报错:too many initializers 问题求助
问题:结构体数组初始化报错“too many initializers”
环境
- 硬件:运行Debian 12的Raspberry Pi 5
- 编译器:Gnu C++
相关代码
头文件代码
enum SignalNames { WestEN, WestF1, WestFM, WestYardEnter, WestYardEnter2_4, EastYeardEntry1_3, EastYardEnter2_4, EastExit4__Dwarf_, NUM_SIGNALS }; struct SignalConfig { static constexpr uint ASPECTCOUNT = 5; enum Aspect { Stop, Slow_Aproach, Slow_Clear, Aproach, Clear, Hold, Go, UNUSED }; struct { Aspect aspect; openlcb::EventId eventid; } aspects[ASPECTCOUNT]; }; extern const SignalConfig SignalsCfg[NUM_SIGNALS];
C++实现文件代码
const SignalConfig SignalsCfg[NUM_SIGNALS] = { { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Slow_Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, },// WestEN { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::UNUSED, 0LL}, {SignalConfig::UNUSED, 0LL}, },// WestF1 { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, {SignalConfig::UNUSED, 0LL}, {SignalConfig::UNUSED, 0LL}, },// WestFM { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Slow_Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, },// WestYardEnter { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Slow_Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, },// WestYardEnter2-4 { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Slow_Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, },// EastYeardEntry1-3 { {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Slow_Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, },// EastYardEnter2-4 { {SignalConfig::Hold, 0000000000000000LL}, {SignalConfig::Go, 0000000000000000LL}, {SignalConfig::UNUSED, 0LL}, {SignalConfig::UNUSED, 0LL}, {SignalConfig::UNUSED, 0LL}, },// EastExit4 (Dwarf) }; // This is line 145
编译错误信息
/home/heller/WendellDepotMusuem/Software/targets/linux.aarch64/WendellDepot.cxx:145:1: error: too many initializers for ‘const WendellDepot::SignalConfig’ 145 | }; | ^ make[2]: *** [/home/heller/openmrn/etc/prog.mk:288: WendellDepot.o] Error 1
问题分析与修复
错误根源在于SignalConfig结构体的成员aspects是匿名结构体类型的数组,初始化时需要明确标记出这是对数组成员的初始化。当前代码直接将5个匿名结构体作为SignalConfig的初始化项,但SignalConfig只有一个成员(aspects数组),编译器会认为你传递了过多的初始化值,从而报错。
修复方法
给每个SignalConfig实例的初始化内容额外嵌套一层大括号,明确这是对aspects数组的初始化。修改后的单个元素示例:
{ { // 新增这层大括号,标记aspects数组的初始化边界 {SignalConfig::Stop, 0000000000000000LL}, {SignalConfig::Slow_Aproach, 0000000000000000LL}, {SignalConfig::Slow_Clear, 0000000000000000LL}, {SignalConfig::Aproach, 0000000000000000LL}, {SignalConfig::Clear, 0000000000000000LL}, } }, // WestEN
将所有SignalConfig实例的初始化块都加上这层嵌套大括号后,即可解决编译错误。
额外提示
代码中使用的0000000000000000LL是八进制表示的0,若实际需要十六进制值,应改为0x0000000000000000LL,不过这不是当前错误的触发原因。
内容的提问来源于stack exchange,提问作者Robert Heller
相关产品推荐
相关产品推荐

