4

我知道我可以使用指定的初始化程序在 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++ 模式下不工作)。

4

3 回答 3

6

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

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

于 2013-10-09T12:44:56.567 回答
4

指定初始化器(在第一个示例中)和复合文字(在第二个示例中)都在 C99 中引入,C++ 尚不支持它们。

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

于 2013-10-09T12:47:10.193 回答
2

指定的初始化程序是C99的一项功能,但它似乎clang并在C++gcc中支持它们作为扩展,尽管文档另有声明。如果我使用标志构建它,它会说:gccclang-pedantic

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

gcc警告:

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

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

第二个示例使用复合文字,这也是作为扩展支持的C99功能。

于 2013-10-09T12:42:34.110 回答