GCC10编译C++20代码报C99 designator outside aggregate initializer错误排查
问题原因梳理
你遇到的报错是两个问题叠加导致的:
- C20的指定初始化语法和C99并不完全兼容,且GCC 10对C20指定初始化的支持存在缺陷
- 你使用的
-std=gnu++2a是GCC对还未正式定稿的C20草案的实现,并非完整的正式C20标准支持
具体说明:
- 编译器版本支持问题:GCC对C20指定初始化的完整支持是从GCC 11版本才落地的,GCC 10还未实现对数组类成员的指定初始化识别,只会把你写的
.a语法识别为C99专属的设计器,在C编译场景下就会抛出你看到的报错。 - 语法差异补充:就算升级到支持C20的编译器,C的指定初始化也和C99有区别:要求指定初始化的顺序必须和结构体成员的声明顺序完全一致,不支持C99那样乱序指定成员的写法,否则也会编译报错。
- 编译命令补充:编译C++代码建议直接用
g++命令而非gcc,避免因为前端识别问题带来额外的编译异常。
如果要在GCC 10环境下绕过这个问题,可以直接用传统的聚合初始化写法:
struct Foo { char a[10]; int b; }; static Foo foo = {"bla"};
如果要保留指定初始化写法,升级到GCC 11及以上版本,使用-std=c++20参数编译即可正常通过。
内容的提问来源于stack exchange,提问作者Yunus King
相关产品推荐
相关产品推荐

