请考虑以下示例,该示例使用默认值初始化数组:
static unsigned int array[10] = { [ 0 ... 9 ] = 5 };
该运算符的作用是什么?
它与可变参数宏__VA_ARGS__
有关吗?
答案 0 :(得分:3)
在标准C中,从C99开始,指定的初始化程序允许以以下形式初始化数组的各个元素:
int array[4] = {[1] = 42};
您偶然发现的语法是范围初始化程序,它是GNU扩展,用于将0
和9
之间的所有元素初始化为给定值,因此严格等同于:
static unsigned int array[10] = { [0] = 5, [1] = 5, [2] = 5, [3] = 5, [4] = 5, [5] = 5, [6] = 5, [7] = 5, [8] = 5, [9] };
只减少打字和阅读的负担。
答案 1 :(得分:1)
ISO C中没有。这是一个非标准的构造。
在GNU C(gcc / clang)中,它appears to initialize each of elements 0 through 9 to 5,即(C99)的简写
static unsigned int array[10] = { [0]=5, [1]=5, [2]=5, /*...*/ [9]=5 };
或(C89)
static unsigned int array[10] = { 5, 5, 5, 5, /*...*/ };
...
扩展名也适用于case
s:
_Bool lowercase_eh(char c)
{
switch(c) case 'a' ... 'z': return 1;
return 0;
}
除了使用相同的...
令牌外,它与可变参数宏或功能无关。