如何解决聚合/指定的C ++结构初始化:直接引用另一个字段 详细信息
在使用聚合/结构的指定初始化时,可以引用这样的另一个字段:
#include <stdio.h>
int main()
{
struct
{
int a;
int b;
}
s =
{
.a = 3,.b = s.a + 1,};
return 0;
}
我们在s.b的初始化中使用s.a。但是,我们需要引用s.a到s。是否可以直接将s.a简称为.a
或类似名称?例如,这将可以在初始化如下所示的结构数组时使用相同的语法:
int main()
{
struct
{
int a;
int b;
}
s[] =
{
{
.a = 3,.b = s[0].a + 1,},{
.a = 5,.b = s[1].a - 1,}
};
return 0;
}
在这里,我们可以编写类似.b = .a - 1
的文字,而不是.b = s[1].a - 1
。
解决方法
是否可以仅将
s.a
或类似名称直接引用.a
?
否,.a
在此情况下是指示符,在用于初始化a的 brace-or-equal-initializer 中不能引用它。给定的数据成员通过其匹配的指示符。
struct Bar { int a; };
struct Foo {
int a;
Bar b;
};
int main() {
Foo f = {
// ^ start of braced-init-list
.a
// ^^ designator (for data member of Foo)
= 1,// ^^^ initializer-clause
.b{.a = 2}
// ^^^^^^^^ braced-init-list
// referring to a designator of a
// data member of Bar
};
}
详细信息
P0329R4引入了指定的初始化程序,这是the grammar for braced-init-lists引入的C ++ 20新功能:
braced-init-list: { initializer-list,opt } { designated-initializer-list,opt } { }
其中the grammar of designated-initializer-list是:
designated-initializer-list: designated-initializer-clause designated-initializer-list,designated-initializer-clause
,并且其中designated-initializer-clause:s的语法为:
designated-initializer-clause: designator brace-or-equal-initializer
最后a designator是:
designator: . identifier
现在,brace-or-equal-initializer不允许以任何方式引用同一对象的另一个指示符。请注意,此处的指示符和 other 标识符(例如,将结构的数据成员引用为 brace-or-equal-initializer 的 initializer-clause 或嵌套的 braced-init-list :s的一部分/ em>。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。