为何联合体指定初始化器可在C++11标准下编译通过?
为什么GCC在C++11标准下允许联合体的指定初始化器?
这是GCC提供的非标准语言扩展,它在C++20正式将联合体指定初始化器纳入标准之前,就已经提前支持了这个特性。
具体细节:
- 按照C11至C17的标准规定,联合体的聚合初始化只能初始化第一个非静态数据成员,并且不允许使用指定初始化器(
.成员名=值)的语法。 - GCC为了兼容C语言(C99标准就已经支持指定初始化器),在C++编译模式中默认开启了这个扩展特性,即便你指定了
-std=c++11这类旧标准选项,只要没有启用严格标准检查,编译器就会接受这种写法。 - 如果你想强制遵循严格的C11标准,可以添加
-pedantic-errors编译选项,此时GCC就会报错,提示你“ISO C11 does not allow designated initializers”。
另外你代码中初始化的是联合体的第一个成员a,即便不用指定初始化器,U{3}在C++11中也是合法的聚合初始化,但.a=3这种指定语法本身依然是依赖GCC扩展的写法。
内容的提问来源于stack exchange,提问作者mu5e
相关产品推荐
相关产品推荐

