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

use*_*461 10 c initializer designated-initializer

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

我有一个任务,要求我理解c中的指定初始化器是什么以及用一个初始化变量意味着什么.我不熟悉这个词,也找不到任何结论性的定义.

我一直在寻找不同地方的答案,但找不到任何答案.谢谢您的帮助!

Fed*_*Baù 22

\n

指定初始化器自 ISO C99 以来就出现了,它是一种不同的、更动态的方式,用于在初始化时用 C 进行初始化structunion或者array.

\n

与标准初始化的最大区别在于,您不必以固定顺序声明元素,并且还可以省略 element。

\n

来自GNU 指南

\n
\n

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

\n
\n
\n

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

\n
\n
\n

例子

\n

1. 数组索引

\n

标准初始化

\n
  int a[6] = { 0, 0, 15, 0, 29, 0 };\n
Run Code Online (Sandbox Code Playgroud)\n

指定初始化

\n
  int a[6] = {[4] = 29, [2] = 15 }; // or\n  int a[6] = {[4]29 , [2]15 }; // or\n  int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };\n
Run Code Online (Sandbox Code Playgroud)\n

2. 结构体或联合体:

\n

标准初始化

\n
struct point { int x, y; };\n
Run Code Online (Sandbox Code Playgroud)\n

指定初始化

\n
 struct point p = { .y = 2, .x = 3 }; or\n struct point p = { y: 2, x: 3 };\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

标准初始化

\n
int a[6] = { 0, v1, v2, 0, v4, 0 };\n
Run Code Online (Sandbox Code Playgroud)\n

指定初始化

\n
int a[6] = { [1] = v1, v2, [4] = v4 };\n
Run Code Online (Sandbox Code Playgroud)\n

4、其他:

\n

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

\n
int whitespace[256] = { [\' \'] = 1, [\'\\t\'] = 1, [\'\\h\'] = 1,\n                        [\'\\f\'] = 1, [\'\\n\'] = 1, [\'\\r\'] = 1 };\n
Run Code Online (Sandbox Code Playgroud)\n

在 \xe2\x80\x98=\xe2\x80\x99 之前写入一系列 \xe2\x80\x98.fieldname\xe2\x80\x99 和 \xe2\x80\x98[index]\xe2\x80\x99 指示符指定要初始化的嵌套子对象

\n
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };\n
Run Code Online (Sandbox Code Playgroud)\n
\n

指南

\n\n


Bat*_*eba 14

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

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

int foo[10] = { [3] = 1, [5] = 2 };
Run Code Online (Sandbox Code Playgroud)

将所有元素设置foo为0,除了索引3(将设置为1)和索引5(将设置为2).

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

struct Foo { int a, b; };
Run Code Online (Sandbox Code Playgroud)

你可以写

struct Foo foo { .a = 1, .b = 2 };
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,未显式初始化的成员将被初始化,就像实例具有static持续时间一样.


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