按名称初始化结构体数组成员

4

我有一个结构体,大概长这样:

typedef struct
{
    uint32_t a;
    uint32_t b;
    uint32_t c[5];
    uint32_t d;
} MY_STRUCT_T;

我希望通过名称初始化c为非零值,其他所有内容都为0。

如果c不是一个数组,我可以这样做:

static MY_STRUCT_T my_struct = {.b = 1}; 

我知道我可以做到这一点:

static MY_STRUCT_T my_struct = {.c[0]=5,
    .c[1]=5,
    .c[2]=5,
    .c[3]=5,
    .c[4]=5};

但我在想是否有更优雅的语法,而我不知道: 类似于:

static MY_STRUCT_T my_struct = {.c[] = {5,5,5,5,5}};

我已经阅读了以下内容,但它们没有回答这个问题:
将结构体初始化为0
将结构体初始化为零/空值
在C++中更好地初始化类的静态数组成员(尽管const更受欢迎)
如何将数组的所有成员都初始化为相同的值?

除了 .c= 部分之外,这与 如何将数组的所有成员初始化为相同的值 没有太大区别。 - chux - Reinstate Monica
2个回答

3

我写了这个问题,然后进行了一段时间的实验,发现以下内容可以解决问题:

static MY_STRUCT_T my_struct = {.c={5,5,5,5,5}};

我认为 static MY_STRUCT_T my_struct = {.c={5}}; 也可以工作。 - Jean-François Fabre
@Jean-FrançoisFabre:这将初始化c数组成员除第一个元素外的所有元素为零(就像普通数组初始化一样)。 - Grzegorz Szpetkowski
@GrzegorzSzpetkowski:我想我错过了那个逻辑 :( - Jean-François Fabre
2
@Jean-FrançoisFabre:初始化逻辑很简单,如果任何成员的任何值被初始化,则所有其他未明确初始化为某个值的值都将默认初始化为零.c={5}; 等同于 .c={5,0,0,0,0};,而 .c={5,5}; 等同于 .c={5,5,0,0,0}; - David C. Rankin

0

OP有三个目标:1)字段数组大小是固定宽度,2)像{7,7,7,7,7}这样的初始化也是固定宽度,3)将c赋值为非零值。由于#1和#2的大小是独立编码的,可以实现其中两个目标,但不是所有三个目标 - 这很棘手。

如果uint32_t c [5];后来变成uint32_t c [6];,那么有什么防止/警告MY_STRUCT_T my_struct = {.c = {5,5,5,5,5}};不符合目标的方法吗?实际上没有。

缺乏可维护的编码范例,请考虑this - copy one by one


是的,总结是正确的。那个链接的想法不是想法,因为我实际上必须调用那个“for”循环代码段。 - Frederick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接