C99增加了一种新特性:指定初始化项目(designated initializer)。此特性允许选择对某些元素进行初始化。
数组的指定初始化项目
例如:要对数组的最后一个元素初始化。按照传统的C初始化语法,需要对每一个元素都初始化之后,才可以对最后的元素进行初始化:
int arr[6] = {0, 0, 0, 0, 0, 212} // 传统语法
而C99规定,在初始化列表中使用带有方括号的元素下标可以指定某个特定的元素:
int arr[6] = {[5] = 212}; // 把arr[5]初始化为212
对于通常的初始化,在初始化一个或多个元素后,未经初始化的元素都将被设置为0。
附加的指定初始化规则:
1. 如果在一个指定初始化项目后跟有不止一个值,则这些数值将用来对后续的数组元素初始化。
2. 如果多次对一个元素进行初始化,则最后的一次有效。
代码示例:
// 使用指定初始化项目
#include <stdio.h>
#define MONTHS = 12
int main (void)
{
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
int i;
for (i = 0; i < MONTHS; i++)
printf("%2d %d\n", i + 1; days[i]);
return 0;
}
输出:
1 31
2 29
3 0
4 0
5 31
6 30
7 31
8 0
9 0
10 0
11 0
12 0
结构的指定初始化项目
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目相似。只是,结构的指定初始化项目使用点运算符和成员名来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
struct book surprise = {.value = 10.99};
可以按照任意的顺序使用指定初始化项目。跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员之后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值:
struct book gift = { .value = 18.90, .author = "James Broadfool", 0.25 };
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
ref: 《C Primer Plus》