gcc对数组初始化对扩展

背景

今天研究一个问题时看linux的内核代码,偶然间发现一段有趣的代码。直接上图:
在这里插入图片描述
从图中代码可以看出这是一个int数组,并且对该数组进行了初始化。但有意思的是本代码中数组初始化中使用了数组下标,并且还可以批量初始化。

用例测试

用例代码

文件名称test.c
内容:

#include <stdio.h>

#define TEST_MAX 10

static int test_int_arr[TEST_MAX] = {
    [0 ... TEST_MAX-1] = -1,
    [5] = 5,
    [9] = 9,
};

int main(int argc, char **argv)
{
    int i;
    for (i = 0; i < TEST_MAX; ++i) {
        fprintf(stderr, "%04d. %d\n", i, test_int_arr[i]);
    }
    return 0;
}

测试结果

xxxx:~$ gcc -o test test.c
xxxx:~$ ./test 
0000. -1
0001. -1
0002. -1
0003. -1
0004. -1
0005. 5
0006. -1
0007. -1
0008. -1
0009. 9
xxxx:~$

gcc扩展说明

原文引用:https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
从gcc的官方文档中可以得知,上面的这种形式的数组初始化是ISO C99的新特性(相较于C90)。在C99标准中,允许以任意顺序指定数组的索引或结构的名称。所以GNU C也对该扩展进行了相应的支持(注意,这个扩展不是在GNU C++中实现的)。

对指定下标数组元素的初始化

示例:
int a[6] = { [4] = 29, [2] = 15 };
等价代码:
int a[6] = { 0, 0, 15, 0, 29, 0 };

将指定范围数组元素初始化为相同值

示例:
int widths[] = { [0 … 3] = 1, [4 … 8] = 2, [9] = 3 };
等价代码:
int widths[] = {1, 1, 1, 1, 2, 2, 2, 2, 2, 3};

没有指定初始化的值使用默认值初始化

示例:
int a[6] = { [1] = v1, v2, [4] = v4 };
等价代码:
int a[6] = { 0, v1, v2, 0, v4, 0 };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值