C 结构体复合初始化,无需将所有内容设置为零

问题描述 投票:0回答:2

有没有类似的语法

typedef struct foo
{
   int X;
   int Y;
   int Z;
} foo;

int main()
{
   // Initialize everything
   foo Variable = (foo){
    .X = 10;
    .Y = 15;
    .Z = 20;
   };

  // Assign the X and Y variables, but keep Z the same
  Variable = (foo){
   .X = 15;
   .Y = 20;
  // .Z stays the same
  };
}

如果有这种类型的 QOL 语法而不是必须打字就好了

int main()
{
   foo Variable = {bla bla};

   // Keep having to type Variable. to access struct members
   Variable.X = 10;
   Variable.Y = 15;
}

这对于结构中的结构来说真的很烦人,即

Struct1->Struct2.Struct3.Element.X = 10;
Struct1->Struct2.Struct3.Element.Y = 15;
c syntax
2个回答
2
投票

初步整改:
发布的代码片段并非来自编译器已看到的“live”源。在文本框中键入代码示例可能会导致输入几乎看不见的语法错误。 更糟糕的是,这些错误太容易传播。
要初始化的成员形成一个

列表

。列表术语用逗号分隔,而不是分号。请参阅下面的代码,显示此较小的语法错误已更正。

不,C 不支持这种初始化或赋值方式。

如果您只想访问结构的一部分,则需要明确表达。

编辑:

你可以逃脱:

Variable = (foo){ .X = 15, // NB: comma, not semi-colon .Y = 20, .Z = Variable.Z };

至少优化编译器只会生成变化元素的操作。但它比单一作业的来源更多。


-1
投票

struct { int f1; int f2; struct { int b1; int b2; int b3; } bar; } foo = { 1, 2, { 42, 43, 44 }, }; printf( "%d %d %d\n", foo.bar.b1, foo.bar.b2, foo.bar.b3 ); #define S foo.bar S.b1 = 7; S.b2 = 8; printf( "%d %d %d\n", S.b1, S.b2, S.b3 ); #undef S

© www.soinside.com 2019 - 2024. All rights reserved.