c语言取字符ascull,什么是标记结构初始化语法?

AnT..

79

当您{}在"传统"ANSI C语言(C89/90)中使用聚合初始化器(初始化器)时,您必须按顺序为每个结构成员提供单独的初始化器,从第一个开始.例如

struct S { int a, b, c, d; };

struct S s = { 1, 2, 3, 4 };

/* 1 for `s.a`, 2 for `s.b` and so on... */

您不需要为所有成员指定初始值设定项,即您可以随时停止(其余成员将被零初始化).

如果由于某种原因你只关心显式初始化结构的第三个成员,你必须为第一个和第二个成员提供"虚拟"显式初始化器(只是为了达到所需的第三个)

/* We only care to explicitly initialize `s.c` */

struct S s = { 0, 0, 3 };

/* but we have to explicitly initialize `s.a` and `s.b` as well */

或者完全放弃特定的初始化(可能用泛型替换它= { 0 })并使用后续的特定成员赋值

struct S s = { 0 };

s.c = 3;

这种基于任务的方法的一个显着好处是它独立于成员c在声明中的地位struct S.

新的C语言规范(C99)允许您通过提供所需的成员名称来使用"标记的"初始化程序 {}

struct S s = { .c = 3 };

这样,您只需显式初始化所需的成员(并让编译器对其余成员进行零初始化).这不仅可以节省一些输入,还可以使聚合初始值设定项与结构类型声明中指定成员的顺序无关.

您可能知道,聚合初始化程序也可以与数组一起使用.C99也支持使用数组进行"标记"初始化.以下示例说明了在数组的情况下"标签"的外观

int a[10] = { [5] = 3 };

/* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */

值得注意的是,C语言继续坚持聚合初始化的"全有或全无"方法:如果为结构或数组的一个(或某些)成员指定显式初始化器,则整个聚合获得初始化,没有显式初始化程序的成员得到零初始化.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值