代码中采用的数组初始化风格是什么?是否属于标准写法?
指定初始化器:来历、用法与标准合规性
嘿,你遇到的这个数组初始化写法叫做指定初始化器(designated initializers),我来给你掰扯清楚:
1. 语法的作用与来历
这种写法允许你直接通过数组索引(比如[0]、[1])给对应位置的元素赋值,不用严格按照数组顺序依次初始化。比如你要是写:
long arr[] = { [2] = 200, [0] = 100 };
那arr[0]会是100,arr[2]是200,中间的arr[1]会被默认初始化为0(数值类型的默认初始化规则)。
这个语法最早是C99标准引入的,初衷是让稀疏数组、结构体的初始化更清晰直观,不用为了给某个特定位置赋值而填充一堆默认值。
2. C++标准的合规性
你用g++-6 -std=c++14编译的情况,得划重点说:
- 在**C20之前的标准(包括C11、C++14)**里,指定初始化器并不是标准语法,属于GCC、Clang这类主流编译器提供的非标准扩展
- 从C++20开始,指定初始化器被正式纳入C标准,不过C版本的语法比C更严格——比如C++要求指定的初始化顺序必须和数组/结构体的声明顺序一致,而C允许乱序
你的代码能编译通过并输出100 101,就是因为GCC在C++14模式下开启了这个扩展支持,运行结果和老写法完全一致。
3. 实际使用的注意点
- 如果要写严格符合C++14及更早标准的代码,不建议用这个写法,换个不支持该扩展的编译器(比如某些老版本的MSVC)可能会编译失败
- 要是基于C++20及以后的标准开发,放心用就行,这时候是完全合规的标准语法
- 这个写法在初始化结构体时也能用,比如指定结构体成员名来赋值,同样是C99引入、C++20标准化的特性
内容的提问来源于stack exchange,提问作者Leedehai
相关产品推荐
相关产品推荐

