首页 >后端开发 >C++ >为什么 C 中的结构不支持点表示法初始化?

为什么 C 中的结构不支持点表示法初始化?

Susan Sarandon
Susan Sarandon原创
2024-11-01 05:43:27180浏览

Why is dot-notation initialization not supported for structs in C  ?

C 结构初始化:另一种方法

在 C 中,与 C 不同,不可能使用如下所示的点表示法来初始化结构:

<code class="c++">struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};

// Invalid C++ syntax
address temp_address = { .city = "Hamilton", .prov = "Ontario" };</code>

这个查询提出了几个问题:

  • 为什么 C 不支持这种初始化方法?
  • 是由于技术还是实际原因?
  • 是否有其他方法可以提高结构初始化的可读性?

技术和实践原因

从技术上讲,不存在任何潜在的限制阻止C 中结构的点表示法初始化的实现。然而,出于以下几个实际原因,C 标准委员会选择不包含此功能:

  • 一致性: C 旨在实现不同语言功能之间的一致性。由于点表示法初始化不适用于其他类型(例如数组),因此将其应用于结构可能会导致混乱。
  • 类型安全:点表示法初始化可能会绕过类型检查如果成员名称或类型不正确,则会引入错误。
  • 维护:支持此方法会增加编译器的复杂性,并使维护和发展语言变得更加困难。

可读性的替代方法

要增强可读性,请考虑以下替代方法:

  • 多行初始化:将初始化拆分为多行,并为每个成员添加注释:
<code class="c++">address temp_address = {
  0,  // street_no
  nullptr,  // street_name
  "Hamilton",  // city
  "Ontario",  // prov
  nullptr,  // postal_code
};</code>
  • 初始化器列表: 使用带有初始化器列表的构造函数来初始化成员:
<code class="c++">struct address {
  address(int sn, char* stn, char* c, char* p, char* pc):
    street_no(sn), street_name(stn), city(c), prov(p), postal_code(pc) {}

  int street_no;
  char *street_name;
  char *city;
  char *prov;
  char *postal_code;
};

address temp_address(0, nullptr, "Hamilton", "Ontario", nullptr);</code>

这些替代方案提供显式且可读的初始化,同时遵守 C 的类型安全性和一致性原则。

以上是为什么 C 中的结构不支持点表示法初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn