【问题标题】:What is a designated initializer in C?什么是 C 中的指定初始化程序?
【发布时间】:2018-04-22 11:44:09
【问题描述】:

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

我有一个作业要求我了解 C 中的指定初始化程序是什么以及用一个初始化变量意味着什么。

我不熟悉这个术语,也找不到任何确凿的定义。

什么是 C 中的指定初始化程序?

【问题讨论】:

  • 我投票结束这个问题,因为没有进行认真的研究。
  • @chux 否定,我一直在寻找一个副本,但找不到一个,只有一些显示如何初始化 either 数组 or 一个结构体,但两者都不是。
  • @chux SO 应该是相关问题的高质量答案的存储库,对吧?碰巧的是,今天有这个问题,很高兴在一个我可以信任的地方找到芭丝谢芭的简洁答案。 (是的,我应该有自己的 C11 标准副本,但可惜我没有。而且无论如何,标准并不总是让凡人找到答案的最佳场所,所以这里的 Q 和 A 看起来很完美合适。)
  • 刚刚在 C++ 周刊频道youtube.com/watch?v=44rs_hX1dxE 上观看了 Jason 的解释@

标签: c struct union initializer designated-initializer


【解决方案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 };

指南

【讨论】:

    【解决方案2】:

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

    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++ 不支持任何一种(因为构造函数可以使用该语言完成工作。)

    【讨论】:

    • 查看this 以进一步了解 C++。我相信它已经为下一个标准做好了准备。
    • @AnttiHaapala:需要在划线前挖掘出我的最终评论标准。 (唉,我在 choo choo)。我认为是正确的。
    • port70.net/~nsz/c/c11/n1570.html#6.7.9p9 至少未命名的结构成员未初始化。
    • 未在代码中显式初始化的成员(变量)将由编译器自动初始化为 0。就像所有静态和全局变量在未显式完成时总是自动初始化为 0在代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多