You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:04:52