使用匿名结构与使用 typedef 的命名结构

2023-12-19

什么时候应该使用以下语句之一而不是另一个?

typedef struct Foo {
    int a;
} Bar;

and

typedef struct {
    int a;
} Bar;

并像这样使用它

Bar bar1 = { 5 };

我知道第二个是一个匿名结构,但不确定何时应该使用一个结构而不是另一个结构。


它们几乎是等价的。实际上,您可以并且应该在两个地方使用相同的名称。使用相同的名称,除非您能找到充分的理由不这样做。

您需要非匿名的一种情况是当您需要指向相同类型的对象的指针时,例如在链接列表中。

typedef struct Node {
    struct Node* next;
    int data;
} Node;

一种替代方案:

typedef struct Node Node;

struct Node {
    Node * next;
    int data;
};

根据 Linus Torvalds 的说法,除非你想隐藏它,否则你应该避免使用类型定义结构。来自Linux 内核编码风格指南 https://www.kernel.org/doc/html/v4.10/process/coding-style.html#typedefs:

请不要使用 vps_t 之类的东西。对结构和指针使用 typedef 是错误的。当你看到一个vps_t a;在源码中,这是什么意思?相反,如果它说struct virtual_container *a;你实际上可以分辨出 a 是什么。

很多人认为 typedef 有助于提高可读性。并非如此。它们仅用于:

a) 完全不透明的对象(其中 typedef 被主动用来隐藏对象是什么)。

...

据此,您永远不应该使用匿名结构,并且 typedef 严格用于接口。所以它应该看起来像这样:

typedef struct Node {
    struct Node* next;
    int data;
} Node;

但如果您真的要创建一个接口,那么通常应该将其分成头文件和源文件。在这种情况下,请将 typedef 放入头文件中,并且不要在源文件中使用 typedef:ed 类型。

.c

struct Node {
    struct Node* next;
    int data;
} Node;

void insert(struct Node* head, int data) 
{
// Code
}    

.h

typedef struct Node Node;

void insert(Node* head, int data);

考虑到上述所有因素,使用匿名结构的唯一有效情况是同时声明一个对象,如下所示:

struct {
    int data;
    float more_data;
} myObject; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用匿名结构与使用 typedef 的命名结构 的相关文章

随机推荐

  • 调用函数的 Excel 单元格[重复]

    这个问题在这里已经有答案了 如何获取调用 VBA 函数的单元格 换句话说 INDIRECT ROW COLUMN 的 VBA 等效项是什么 I m not寻找活性细胞 我想做的是有一个简单的功能ThisRow Col rColumn As
  • SIP 408:在 zoiper 中创建帐户时请求超时

    我已经下载了zoiper220 linux tar gz并解压缩它 但是当我尝试在其中创建帐户时 它显示 SIP 408 请求超时错误 我已经尝试这个好几天了 提前致谢 您必须首先使用 sip conf 中设置的用户名和密码在软电话中注册
  • Reshaper 默认格式和规则列表

    我正在尝试查找 Resharper 强制执行的所有默认格式和规则的列表 不幸的是 我没有任何运气 我们使用该工具 但希望向新员工提供标准文档 以便他们可以在编码之前查看标准 在 ReSharper 菜单下的 选项 下 您将找到 ReShar
  • 如何在绘制多个热图时修复 plt.tight_layout() 错误

    我正在将多个热图绘制在一起 并且不希望它们用轴标签挤满空间 我尝试使用 plt tight layout 但它向我抛出了一些错误 这是我没有 plt tight layout 的结果 没有 plt tight layout 的热图 http
  • 我在实施传单抽奖时做错了什么。在这个具体示例中如何使用 WFST?

    我是地理信息开发领域的新手 我按照下面的管道架构流程来实现基于 GIS 的应用程序问题 PostGIS GeoServer 传单 我已经设置了传单客户端应用程序 它将图块组成地图 我还使用一些传单插件 如绘图 缩放 以便用户可以选择在地图上
  • 一个函数可以检测 NaN、NA、Inf、-Inf 等?

    R 中是否有一个函数可以确定某个值是否为NA NaN Inf Inf 或者不是一个格式良好的数字 你要is finite gt is finite NA 1 FALSE gt is finite NaN 1 FALSE gt is fini
  • {@inheritDoc} 不继承 Eclipse 中的超类 javadoc

    当我使用 inheritDoc 在 Eclipse 中 超类的 javadoc 注释没有出现在我的类的 javadoc 中 我有以下代码 import javax swing table AbstractTableModel public
  • 如何使用 MVC 4 显示数据库中的二进制图像以编辑表单

    我成功地将图像作为二进制图像存储在数据库中 我想在编辑表单中显示这些图像以修改并保存更改 显示数据库中的二进制图像时 以 Edit cshtml 形式抛出 System OutOfMemoryException 有人可以纠正我的代码吗 型号
  • Google App Engine 防火墙和内部访问

    我有两项服务在 Google App Engine flex 同一项目 上运行 我希望一项服务使用 HTTPS 调用另一项服务 最重要的是 我设置了防火墙 只允许0 1 0 40 and 10 0 0 1 我也在设置X Appengine
  • mclapply 与 for 循环绘图:速度和可扩展性焦点

    我正在 R 中运行一个函数 该函数可能需要很长时间才能运行 因为它在将某些数据推入之前执行多个命令来转换和子集一些数据ggplot来策划 我需要多次运行此函数来调整参数值 我将提供的示例是一个简单的示例 但想知道如何加快速度 如果扩大规模
  • C++/CLI .NET 可以使用资源 .resx 文件进行本地化吗?

    我正在尝试将托管 C NET DLL 本地化为多种语言 这些表单非常简单 因为它们的操作就像其他语言一样并创建多个 resx 文件 除了以传统 C 方式使用 RC 字符串表之外 我找不到任何在托管 C 中本地化嵌入字符串的示例 有没有什么方
  • 我可以为任何没有 UDID 的设备分发我的应用程序吗?

    我一直在搜索 stackoverflow 阅读各种博客来获取我的问题的答案 我可以将我的应用程序分发给某人 而不获取他的设备 UDID 吗 我找到的答案都是 不 你必须有 UDID 列表 但是 有人 私营公司 告诉我 他们过去常常在不向开发
  • 64 位模运算的奇怪性能行为

    这些方法调用中的最后三个大约需要花费大约时间 比前四个时间多了一倍 唯一的区别是它们的参数不再适合整数 但这有关系吗 该参数被声明为long 因此无论如何都应该使用long进行计算 模运算是否使用另一种数字 gt maxint 算法 我使用
  • 有没有办法让 Activity 知道刚刚创建了什么片段?

    An Activity可能会膨胀任意布局 xml 该布局可能有也可能没有Fragment其中的占位符 如果是的话 Fragment将被实例化并附加到Activity 有什么办法可以参考一下Fragment来自Activity那已经附加了吗
  • JSF 2 默认日期时间转换器模式

    我的 JSF 页面以以下格式显示托管 bean 的日期时间 MM dd yyyy h mm a 我想避免在不同页面中重复声明转换器
  • protobuf-net 是否支持 C# 9 位置记录类型?

    我正在尝试将 protobuf net 与 C 位置记录类型一起使用 并且遇到了此异常 10 18 48 048 EROR 010 Microsoft AspNetCore Server Kestrel Connection id 0HM4
  • 无法在 itunes connect 中更改捆绑包 ID?

    我的第一个应用程序被拒绝 因为它的捆绑包 ID 中有 Youtube 一词 从那时起 我更改了 plist info 中的包 ID 和 Xcode 中的包标识符 我还在 Apple 开发者网站的会员中心的标识符部分下创建了一个新的应用程序
  • 以下划线开头的名称显示错误 gh-pages 分支的页面不存在

    我对 github 的 gh pages 有疑问 以 下划线 开头的 html 页面显示错误 Page does not exist Read the Full Documentation Instructions for setting
  • 构建大型 KML 文件

    我生成的 KML 文件可能有 50 000 个或更多地标 根据特定于域的分组排列在文件夹中 KML 文件使用打包到 KMZ 文件中的自定义图像 我希望将单个 KML 文件分解为多个文件 并根据分组进行分区 因此我不会拥有 1 个带有文件夹的
  • 使用匿名结构与使用 typedef 的命名结构

    什么时候应该使用以下语句之一而不是另一个 typedef struct Foo int a Bar and typedef struct int a Bar 并像这样使用它 Bar bar1 5 我知道第二个是一个匿名结构 但不确定何时应该