初始化结构的指定初始化
Designated initialization of initialized struct
我知道我可以使用指定的初始值设定项初始化 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++ 的一部分。因此,C++编译器拒绝代码是正确的,并且在这两种情况下都应该这样做。
第二个结构是"复合文字",同样是不属于C++的 C 特征。因此,C++编译器应该拒绝它,而 C99(或更高版本(编译器应该接受这两个代码片段。
指定初始值设定项(在第一个示例中(和复合文本(在第二个示例中(都是在C99中引入的,C++尚不支持它们。
但是,某些编译器可能会在C++中支持这些功能作为扩展。例如,gcc 支持C++中的复合文本,但不支持指定的初始值设定项。似乎您的编译器也这样做。
指定初始值设定项是 C99 的一项功能,但它似乎clang
,gcc
C++中支持它们作为扩展,尽管 gcc
文档另有声明。如果我使用 -pedantic
标志与clang
构建它,它说:
warning: designated initializers are a C99 feature [-Wc99-extensions]
gcc
警告:
warning: ISO C++ does not allow C99 designated initializers [-Wpedantic]
在C++我们有构造函数,它允许您以更简洁的方式初始化结构。
第二个示例使用复合文本,这也是支持作为扩展的 C99 功能。
相关文章:
- 在C和C++中初始化结构中的数组
- 我们可以用参数化构造函数初始化结构的数组吗?
- 尝试初始化结构内的联合时出错
- 使用其他成员初始化结构的成员?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何在另一个结构中初始化结构数组?
- 如何在构造函数中初始化结构体的动态数组?
- 初始化结构中的联合 - c++
- 尝试初始化结构向量时出现编译错误
- 用于初始化结构的 void 指针强制转换
- 初始化结构的两种方式
- 使用用户定义的构造函数初始化C++结构
- 使用初始值设定项列表初始化结构,对于 std::array 失败
- 在 c++ 中初始化结构的指针
- 无序列图会创建一个零初始化结构吗?
- 如何在C++中初始化结构
- C 用结构指针初始化结构
- 在C 中初始化结构数组
- 使用数组聚合初始化结构数组