使用匿名结构与使用 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 的命名结构 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 调用函数的 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 我知道第二个是一个匿名结构 但不确定何时应该