【问题标题】:Three dots operator "..." for initializing an array三点运算符“...”用于初始化数组
【发布时间】:2023-03-27 21:10:01
【问题描述】:

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

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

这个操作符到底是做什么的?

与可变参数宏__VA_ARGS__有关?

【问题讨论】:

标签: c operators variadic-macros


【解决方案1】:

在标准 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

【讨论】:

  • 我认为这个例子应该以: , [9] = 5 }; 结尾
  • @jaygeek 你是对的!现在修好了。谢谢。
【解决方案2】:

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

... 扩展也适用于cases:

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

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

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 2010-12-20
    • 2013-03-30
    • 2015-07-11
    • 2013-07-27
    • 1970-01-01
    • 2012-03-25
    • 2013-11-03
    • 2021-07-03
    相关资源
    最近更新 更多