什么是c中的指定初始值设定项?

时间:2017-11-09 13:03:34

标签: c initializer designated-initializer

我知道这可能是一个基本问题。

我有一项任务,要求我理解c中的指定初始值设定项以及用一个初始化变量的含义。 我对这个词并不熟悉,也无法找到任何结论性的定义。

我一直在寻找不同地方的答案但却无法找到答案。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:9)

指定的初始化程序有两种形式:

1)它提供了一种初始化数组中特定元素的快速方法:

int foo[10] = { [3] = 1, [5] = 2 };

将所有元素设置为foo为0,而不是索引3(将设置为1)和索引5(将设置为2)。

2)它提供了一种明确初始化struct成员的方法。例如,对于

struct Foo { int a, b; };

你可以写

struct Foo foo { .a = 1, .b = 2 };

请注意,在这种情况下,未明确初始化的成员会被初始化,就像实例的持续时间为static一样。

<小时/> 两者都是标准C,但请注意C ++也不支持(因为构造函数可以用该语言完成工作。)

答案 1 :(得分:1)

Designed Initializer 自 ISO C99 以来出现,是在初始化 structunionarray 时在 C 中进行初始化的一种不同且更动态的方式。

与标准初始化最大的不同是你不必以固定的顺序声明元素,你也可以省略元素。

来自GNU Guide

<块引用>

标准 C90 要求初始化器的元素以固定顺序出现,与被初始化的数组或结构中元素的顺序相同。

<块引用>

在 ISO C99 中,您可以按随机顺序给出元素,指定它们适用的数组索引或结构字段名称,GNU C 也允许将其作为 C90 模式下的扩展


示例

1.数组索引

标准初始化

  int a[6] = { 0, 0, 15, 0, 29, 0 };

设计初始化

  int a[6] = {[4] = 29, [2] = 15 }; // or
  int a[6] = {[4]29 , [2]15 }; // or
  int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

2.结构体或联合体:

标准初始化

struct point { int x, y; };

设计初始化

 struct point p = { .y = 2, .x = 3 }; or
 struct point p = { y: 2, x: 3 };

3.将命名元素与连续元素的普通 C 初始化相结合:

标准初始化

int a[6] = { 0, v1, v2, 0, v4, 0 };

设计初始化

int a[6] = { [1] = v1, v2, [4] = v4 };

4.其他:

标记数组初始值设定项的元素

int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
                        ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };

在“=”之前写入一系列“.fieldname”和“[index]”指示符,以指定要初始化的嵌套子对象

struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };

指南