为什么在结构定义之后使用 typedef?

2023-11-25

两种风格:

struct _something
{
   ...
};
typedef struct _something someting;

以及那种风格:

typedef struct _something
{
  ...
} something;

是 C 中正确的 typedef 声明。
请注意结构声明的存在在标题中文件是故意制作的:我need可以在其他地方访问结构的内部组件。

第一个声明的一个缺点是,当您使用任何 IDE 时,自动“跳转到声明”通常会将您引导至typedef struct _something someting;而不是直接给你真正的结构定义。

在第二种方法中,您可以直接进入结构定义。

有人会使用第一种方法吗?
我正在编写的代码充满了这些......
这只是维护者的坏/好习惯吗?


将 typedef 和 struct 声明分开有一个明显的优点,如果将两者分开在不同的文件中,这一优点就很明显。它允许数据封装。

您在头文件中声明您的

typedef struct whatever typename;

这是一个类型的声明struct whatever不知道它是如何实现的。您现在可以声明属于接口一部分的函数,而无需透露结构内部的任何内容。传递一个指针到那个typename这就是所需要的一切。

在“类”的实现文件中(我将其放在引号中,因为我们纯粹在 C 上下文中讨论),您可以执行以下操作:

#include "header.h"

struct whatever {
  ...
  ...
  /* can even contain references to `struct whatever` or even `typename` */
};

这种封装的优点是您可以更改内部结构,而无需重新编译应用程序的其余部分。如果您使用动态库,可以派上用场。

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

为什么在结构定义之后使用 typedef? 的相关文章

随机推荐

  • 从枚举中选择一个随机值?

    如果我有一个这样的枚举 public enum Letter A B C 随机选择一个的最佳方法是什么 它不需要是生产质量防弹的 但相当均匀的分布会很好 我可以做这样的事情 private Letter randomLetter int p
  • iPython - 在新选项卡中显示完整数据框

    在 Jupyter 中 使用 Pandas 有没有办法在导航器的新选项卡中显示整个数据框 当我想要控制数据框时 我通常将其导出为 csv 然后在 Excel 中打开 我正在寻找一种更快的方法 但我不愿意将全帧显示到我的笔记本中 因为它使其不
  • 如何知道我的 Android 应用程序已升级以便重置闹钟?

    我注意到 当设置此警报的应用程序已升级时 警报将被禁用 真的吗 到目前为止 我使用的是SharedPreferences with a FIRST RUN键以了解这是否是我的应用程序的第一次运行 如果我找不到这个键 我会启用警报并设置FIR
  • 如何在python中使用flask上传多个文件

    这是我的多个文件上传的代码 HTML 代码 Browse
  • 构建器模式:首选哪种变体? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在阅读 Effecti
  • 使用 SVG 符号隐藏渐变

    我正在使用 SVG 符号this way 但是display noneSVG 的渐变隐藏了图形的渐变 任何想法 在下面的示例中 应该有两个圆圈 但红色的圆圈被隐藏了
  • fpdf分页问题

    我有一个循环打印 6 行 多单元格 约 30 次 问题是 当它到达底部页面时 它会打印多单元格中的 2 或 3 行 并在下一页上打印其他 3 行 如果当前页面上没有足够的空间容纳所有 6 行 我想让它在下一页上打印所有 6 行 我使用这段代
  • 货到付款仅激活管理员(未启用前端)- Magento?

    我现在使用magento有一段时间了 我想知道是否可以启用货到付款选项仅供管理员使用 我想用它作为商店提货 因此 这种方式只能在管理面板中为那些想要商店取货的人创建手动订单 我不希望它显示在 Magento 前端商店中 大家可以帮帮我吗 有
  • 如何在无会话负载平衡环境中配置 dotNetOpenId

    您以前可能已经解决过这个问题 我需要能够在没有会话粘性的环境中使用open id 服务器确实保留标头 我正在使用 ASP NET MVC 和 dotNetOpenId 版本 3 2 0 9177 尽管在返回响应时 第 3 方网站上的身份验证
  • 使用 jQuery 验证插件的自定义方法

    我正在尝试在 Jquery 中使用自定义验证 所有编码部分都是正确的 但我不知道哪里出了问题 这是代码部分 Password
  • WPF 中文本的外斜角效果

    是否可以对 WPF 中的标签文本应用外斜角效果 对我来说 发光效果应该足够了 这是一种在文本上获得发光效果的方法 使用 OutlinedText 控件这个链接其中提供中风
  • 如何获取手机的ICCID号码?

    如何获取手机的ICCID号码 我查看了 TelephonyManager 类 但没有找到获取 ICCID 号码的方法 只有一个方法可以判断 ICC 卡是否存在 我相信getSimSerialNumber 会得到iccid UPDATE对于
  • 清单合并错误 - 支持库版本不同

    我正在添加步进指示器库 https github com badoualy stepper indicator 到我的项目 为此 我将 jitpack 添加到我的项目 gradle 文件中 并将步进指示器库添加到我的应用程序 gradle
  • 使用 Cocoa Pods 导入 Google Analytics iOS SDK 时出错

    起初 我直接导入 Google Analytics iOS SDK 一切正常 然后我开始使用可可豆荚来管理我的所有外部库并收到此错误 Undefined symbols for architecture i386 OBJC CLASS GA
  • 如何在Python中的函数内随机选择函数

    我有两个函数执行不同的操作 但我希望在另一个函数中随机调用它们 eg def func1 do something def funct2 do something else def func3 select funct1 or funct2
  • 使用联接更新 Informix 表

    这是 Informix 更新的正确语法吗 update table1 set table1 code 100 from table1 a table2 b table3 c where a key c key a no b no a key
  • 警告:函数“getline”的隐式声明

    嗨 我即将完成课堂项目 我需要根据几个因素对航空公司人员的优先级进行排序 这是我的项目描述 一家航空公司使用下面所示的公式来确定乘客的优先顺序 超额预订航班的等候名单 优先级数 A 1000 B C 在哪里 A为客户过去一年的总里程 B 是
  • 自定义 Google 翻译下拉菜单

    我有一个网站 并在该网站中添加谷歌翻译器 以便人们可以查看不同语言的网站 我添加的代码是 div div div div
  • 为什么循环导入看起来在调用堆栈中更上层工作,但随后又向下引发 ImportError ?

    我收到这个错误 Traceback most recent call last File Users alex dev runswift utils sim2014 simulator py line 3 in
  • 为什么在结构定义之后使用 typedef?

    两种风格 struct something typedef struct something someting 以及那种风格 typedef struct something something 是 C 中正确的 typedef 声明 请注