C 结构初始化

新手上路,请多包涵

是否可以在 C++ 中初始化结构,如下所示:

 struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};

address temp_address = { .city = "Hamilton", .prov = "Ontario" };

这里这里 的链接提到只能在 C 中使用这种风格。如果是这样,为什么这在 C++ 中是不可能的?是否有任何潜在的技术原因导致它没有在 C++ 中实现,或者使用这种风格是不好的做法。我喜欢使用这种初始化方式,因为我的结构体很大,而且这种风格让我清楚地了解分配给哪个成员的值。

如果有其他方法可以实现相同的可读性,请与我分享。

在发布此问题之前,我已经参考了以下链接:

  1. 用于 AIX 的 C/C++
  2. 使用变量初始化 C 结构体
  3. 在 C++ 中使用标签进行静态结构初始化
  4. C++11 正确的结构初始化

原文由 Dinesh P.R. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 486
2 个回答

如果您想清楚每个初始化程序的值是什么,只需将其拆分为多行,并在每行上添加注释:

 address temp_addres = {
  0,  // street_no
  nullptr,  // street_name
  "Hamilton",  // city
  "Ontario",  // prov
  nullptr,  // postal_code
};

原文由 Wyzard 发布,翻译遵循 CC BY-SA 3.0 许可协议

你有

  1. 标准初始化列表
   address temp_address {
       /* street_no */,
       /* street_name */,
       ...
       /* postal_code */
   };

   address temp_address2 = {
       /* street_no */,
       /* street_name */,
       ...
       /* postal_code */
   }

  1. 点符号
   address temp_address;
   temp_address.street_no = ...;
   temp_address.street_name = ...;
   ...
   temp_address.postal_code = ...;

  1. 指定的聚合初始化,其中初始化列表包含从 C++20 开始可用的结构的每个成员的标签(请参阅 文档)。

  2. struct C++ 类 - 在 C++ 结构中实际上是特殊类型的类,其中所有成员都是 public (与所有成员都是 —81361a2a946741aa806c57577f 的标准 C++ 类 private 如果没有明确指定)以及使用继承时默认为 public

    struct Address {
       int street_no;
       ...
       char* postal_code;

       Address (int _street_no, ... , char* _postal_code)
        : street_no(_street_no),
          ...
          postal_code(_postal_code)
       {}
   }

   ...

    Address temp_address ( /* street_no */, ..., /* postal_code */);

当涉及到初始化结构的方式时,您应该考虑以下方面:

  • 可移植性——不同的编译器、不同程度的 C++ 标准完整性和不同的 C++ 标准确实限制了您的选择。如果您必须使用 C++11 编译器,但又想使用 C++20 指定的聚合初始化,那么您就不走运了
  • 可读性- 什么更具可读性: temp_address.city = "Toronto"temp_address { ..., "Toronto", ... } ?代码的可读性非常重要。尤其是当您有大型结构(更糟糕的是嵌套结构)时,到处都有未标记的值只是自找麻烦
  • 可扩展性——任何依赖于特定顺序的东西都不是一个好主意。缺乏标签也是如此。您想在结构的地址空间中向上或向下移动成员吗?祝你有一个未标记的初始化列表好运(在结构初始化中寻找交换的值是一场噩梦)……你想添加一个新成员吗?再次祝您好运,一切取决于特定订单。

虽然点表示法意味着您键入更多使用它获得的好处超过了这个问题,因此我可以推荐它,除非您有一个小型结构,在其结构缺乏变化方面是面向未来的,在这种情况下,您可以负担得起初始化列表。请记住:无论何时与其他人一起编写易于遵循的代码都是必不可少的。

原文由 rbaleksandar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题