仅初始化结构或数组的前 n 个成员

Posted

技术标签:

【中文标题】仅初始化结构或数组的前 n 个成员【英文标题】:Initialise first n members only of struct or array 【发布时间】:2020-06-01 14:46:07 【问题描述】:

我正在使用 RAD studio 10.2 附带的 clang 编译器(我认为是 c++ 11)。我今天错误地发现结构或数组的前 n 个成员可以使用通常的大括号进行分配,例如

int a[500]=1;
struct int a,b,c; st=2,3;

上面的编译和工作正常,但我从来没有遇到过这个或以前见过它,我在网上找不到它的提及(也许我使用错误的措辞类型进行搜索)。这个 c++ 记录了吗?

【问题讨论】:

我认为您对 1 所做的第一个分配不会将 1 分配给所有 500 个元素,而是仅将 1 分配给第一个元素。 看看这个en.cppreference.com/w/c/language/array_initialization 如果您不希望发生这种情况,请查看编译器标志 -Wmissing-field-initializers 或(如果您想严格一点)-Werror=missing-field-initializers 【参考方案1】:

对于aggregate initialization,

(强调我的)

如果初始化子句的数量小于成员数and bases (since C++17)或初始化列表完全为空,剩余成员and bases (since C++17)被初始化@987654324 @ 通过空列表,按照通常的列表初始化规则(对非类类型执行值初始化和具有默认构造函数的非聚合类,并对聚合进行聚合初始化)。 p>

这意味着,对于int a[500]=1;,第一个元素被初始化为1,而数组的其余499 个元素被初始化为0。对于struct int a,b,c; st=2,3;,成员a初始化为2b初始化为3,最后一个成员c的值也初始化为0

【讨论】:

【参考方案2】:

我从来没有遇到过这个,也没有见过它使用过,我在网上找不到它的提及(也许我使用了错误的措辞类型进行搜索)。这个 c++ 记录了吗?

是的,这已记录在案。这种语法称为列表初始化 - 更具体地说,因为类型是聚合:这是聚合初始化。

仅初始化结构或数组的前 n 个成员

不能只初始化一些成员/元素。如果您列出初始化类对象或数组,那么所有这些都将被初始化。缺少初始化器的成员/元素将被初始化。

如果你想这样做,那么你可以做的是默认初始化类对象或数组,然后有选择地初始化子对象。

【讨论】:

以上是关于仅初始化结构或数组的前 n 个成员的主要内容,如果未能解决你的问题,请参考以下文章

C89,C99: C数组&结构体&联合体快速初始化

C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

宏定义中对结构体变量进行初始化,结构体成员变量前为啥加点号??

特定的初始化

华为OD机试真题Java实现矩阵扩散真题+解题思路+代码(2022&2023)