【问题标题】:Designated initialization of initialized struct初始化结构体的指定初始化
【发布时间】:2013-10-09 12:36:20
【问题描述】:

我知道我可以使用指定的初始化程序在 C99 中初始化一个结构,如下所示:

typedef struct
{
    char a;
    char b;
    int c;

} MyStruct;

MyStruct s = {.a = 1, .b = 2, .c = 3};

(该代码在我的 c++ 编译器中不起作用,但(俄罗斯)维基百科说它应该)

但由于一些奇怪的原因,这样的代码也将编译(并按预期工作):

typedef struct
{
    char a;
    char b;
    int c;

} MyStruct;


MyStruct arr[5];

int main(void)
{
    arr[0] = (MyStruct){.a = 1, .b = 2, .c = 0x332211};
}

我认为初始化应该只在创建对象时起作用,而不是之后。

这是正常的行为还是某种编译器怪癖?它应该在 C++ 中工作吗? 花括号中的这个东西到底是什么?某种临时未命名的结构? 我正在使用 Keil uVision 4(并且指定的初始化程序在 c++ 模式下不工作)。

【问题讨论】:

  • 你的编译器是什么?海湾合作委员会?
  • 请添加维基百科所说的链接。另外,您真的在询问两种语言(C 和 C++)吗?
  • @YuHao 我的编译器是 Keil uVision(我已经在上面写过)
  • 这些是指定的初始化器与复合文字相结合。它在 C 中有效,而不是 C++。 LINK
  • @Amomum:我看不懂俄语,但我没有在该页面上看到任何指定初始化程序的示例。 English version 正确地将它们提到为 C++ 中不存在的 C 构造。

标签: c++ c struct


【解决方案1】:

指定初始化器是 C 构造,它们不是 C++ 的一部分。所以 C++ 编译器拒绝代码是正确的,在这两种情况下都应该这样做。

第二个构造是“复合文字”,也是一个不属于 C++ 的 C 特性。所以 C++ 编译器应该拒绝它,而 C99(或更新的)编译器应该接受这两个 sn-ps。

【讨论】:

    【解决方案2】:

    Designated Initializer(第一个例子)和Compound Literals(第二个例子)都是C99引入的,C++还不支持。

    但是,某些编译器可能会支持 C++ 中的这些功能作为扩展。例如,gcc 在 C++ 中支持 Compound Literals,但不支持 Designated Initializer。看来您的编译器也是如此。

    【讨论】:

      【解决方案3】:

      Designated Initializers 是一个C99 功能,但似乎clanggccC++ 中支持它们作为扩展,尽管gcc 文档声称并非如此.如果我使用clang 使用-pedantic 标志构建它,它会说:

      warning: designated initializers are a C99 feature [-Wc99-extensions]
      

      gcc 警告:

       warning: ISO C++ does not allow C99 designated initializers [-Wpedantic]
      

      C++ 中,我们有构造函数,可以让您以更简洁的方式初始化 struct

      第二个示例使用Compound Literals,这也是一个C99 功能,支持作为扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多