三点运算符“...”用于初始化数组
Three dots operator "..." for initializing an array
考虑以下使用默认值初始化数组的示例:
static unsigned int array[10] = { [ 0 ... 9 ] = 5 };
这个运算符到底是做什么的?
与可变参数宏有关__VA_ARGS__
?
ISO C 中没有任何内容。它是一个非标准构造。
在 GNU C (gcc/clang) 中 appears to initialize each of elements 0 through 9 to 5,即 shorthand (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;
}
除了使用相同的 ...
标记外,它与可变参数宏或函数无关。
在标准 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] = 5};
只是减轻了打字和阅读的负担。
考虑以下使用默认值初始化数组的示例:
static unsigned int array[10] = { [ 0 ... 9 ] = 5 };
这个运算符到底是做什么的?
与可变参数宏有关__VA_ARGS__
?
ISO C 中没有任何内容。它是一个非标准构造。
在 GNU C (gcc/clang) 中 appears to initialize each of elements 0 through 9 to 5,即 shorthand (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;
}
除了使用相同的 ...
标记外,它与可变参数宏或函数无关。
在标准 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] = 5};
只是减轻了打字和阅读的负担。