背景
今天研究一个问题时看linux的内核代码,偶然间发现一段有趣的代码。直接上图:
从图中代码可以看出这是一个int数组,并且对该数组进行了初始化。但有意思的是本代码中数组初始化中使用了数组下标,并且还可以批量初始化。
用例测试
用例代码
文件名称test.c
内容:
#include <stdio.h>
#define TEST_MAX 10
static int test_int_arr[TEST_MAX] = {
[0 ... TEST_MAX-1] = -1,
[5] = 5,
[9] = 9,
};
int main(int argc, char **argv)
{
int i;
for (i = 0; i < TEST_MAX; ++i) {
fprintf(stderr, "%04d. %d\n", i, test_int_arr[i]);
}
return 0;
}
测试结果
xxxx:~$ gcc -o test test.c
xxxx:~$ ./test
0000. -1
0001. -1
0002. -1
0003. -1
0004. -1
0005. 5
0006. -1
0007. -1
0008. -1
0009. 9
xxxx:~$
gcc扩展说明
原文引用:https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
从gcc的官方文档中可以得知,上面的这种形式的数组初始化是ISO C99的新特性(相较于C90)。在C99标准中,允许以任意顺序指定数组的索引或结构的名称。所以GNU C也对该扩展进行了相应的支持(注意,这个扩展不是在GNU C++中实现的)。
对指定下标数组元素的初始化
示例:
int a[6] = { [4] = 29, [2] = 15 };
等价代码:
int a[6] = { 0, 0, 15, 0, 29, 0 };
将指定范围数组元素初始化为相同值
示例:
int widths[] = { [0 … 3] = 1, [4 … 8] = 2, [9] = 3 };
等价代码:
int widths[] = {1, 1, 1, 1, 2, 2, 2, 2, 2, 3};
没有指定初始化的值使用默认值初始化
示例:
int a[6] = { [1] = v1, v2, [4] = v4 };
等价代码:
int a[6] = { 0, v1, v2, 0, v4, 0 };