三点运算符“ ...”用于初始化数组

时间:2019-06-14 13:10:22

标签: c operators variadic-macros

请考虑以下示例,该示例使用默认值初始化数组:

static unsigned int array[10] = { [ 0 ... 9 ] = 5 };

该运算符的作用是什么?

它与可变参数宏__VA_ARGS__有关吗?​​

2 个答案:

答案 0 :(得分:3)

在标准C中,从C99开始,指定的初始化程序允许以以下形式初始化数组的各个元素:

int array[4] = {[1] = 42};

您偶然发现的语法是范围初始化程序,它是GNU扩展,用于将09之间的所有元素初始化为给定值,因此严格等同于:

static unsigned int array[10] = { [0] = 5, [1] = 5, [2] = 5, [3] = 5, [4] = 5, [5] = 5, [6] = 5, [7] = 5, [8] = 5, [9] };

只减少打字和阅读的负担。

Reference

答案 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; 
}

除了使用相同的...令牌外,它与可变参数宏或功能无关。