繁体   English   中英

将struct初始化为零,除了一个字段

[英]initialize struct to zero except one field

考虑以下结构:

typedef struct _sampleStruct{
    bool b;
    int i;
    double d;
    int arr[10];
}sampleStruct;

我想初始化结构的全局实例,使得b被初始化为true ,并初始化为0此外领域的休息,我想初始化采取地方,我宣布了,即我不想做类似的东西:

sampleStruct globalStruct = {0};

int someFunc()
{
    //...
    globalStruct.b = true;
    //...
}

有没有办法做到这一点? 我想做类似的事情:

sampleStruct globalStruct = {.b = true, 0};

它是否承诺所有其他领域始终为零?

它是否承诺所有其他领域始终为零?

是。 未显式初始化的成员将作为指定初始化程序的一部分进行零初始化。 你甚至不需要那个0 这个:

sampleStruct globalStruct = {.b = true};

应该足够了。

是的,这是由C11 6.7.9 / 21保证的:

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同。

“Aggregate”是标准的乱码意思:数组或结构或联合。 而不是简单的单值变量(“标量”)。

在上面,“初始化好像它有静态存储持续时间”意味着(6.​​7.9 / 10):

如果未显式初始化具有静态或线程存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;

这适用于初始化列表中的所有形式的初始值设定项。 指定的初始化程序也不例外,也不是特例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM