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

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, /*...*/ };

... 扩展也适用于 cases:

_Bool lowercase_eh(char c)
{
    switch(c) case 'a' ... 'z': return 1;
    return 0; 
}

除了使用相同的 ... 标记外,它与可变参数宏或函数无关。

在标准 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] = 5};

只是减轻了打字和阅读的负担。

Reference