C语言中结构体标签的使用

我们都知道,结构体标签就是结构体的名称,为结构体命名可以方便我们在后续继续使用该结构体。

struct student {char* name;int age;
}struct student zhangsan;
struct student lisi;

这里定义了两个student结构体类型的变量,每次使用时都需要加上struct,比较麻烦。实际上更多情况下
我们会使用typedef来给一个匿名结构体起个别名,不用每次都输入struct

typedef struct {char* name;int age;
} student;student zhangsan;
student lisi;

这个结构体没有标签,所以是个匿名结构体,但是我们通过typedef给他定义一个别名student,通过别名
定义变量不需要加struct前缀。

有了typedef,似乎结构体标签没有存在的必要了,其实不然。

使用typedef的写法,如果student类型要暴露给其他模块,那么必须要写在头文件当中。这将同时暴露
所有结构体的成员,有时候这是违背设计者意愿的。可能设计者希望其他模块的使用者只通过提供的API
来访问student,或者有些成员仅仅是内部使用。

使用结构体标签就可以避免这个问题。我们可以将结构体定义写在源文件中,头文件中仅包含结构体的
声明。

struct student;
extern struct student* create_student(const char* name);
extern void set_student_age(struct student* s, int age);

使用者将不能自己创建student类型对象,只能通过create_student来获取,也不能通过获取到的指针访问
成员age,而是必须通过set_student_age函数接口。

这样写还能避免student结构体成员的变动,导致使用者需要重新编译。当然,为了不重复使用struct这个
单词,我们仍然可以使用typedef来重命名。

typedef struct student student_t;
extern student_t* create_student(const char* name);
extern void set_student_age(student_t* s, int age);

看到C++的前向声明,回过头来才发现C还有那么多细节。

C语言中结构体标签的使用相关推荐

  1. Go语言中结构体打Tag是什么意思?

    前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...

  2. Go语言中结构体打 Tag 是什么意思?

    前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...

  3. C 语言中结构体强制转换--实验

    2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...

  4. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  5. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

  6. c语言定义学生结构体类型,C语言中结构体的三种定义方式

    c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 ...

  7. C语言中结构体直接赋值

    FROM:http://codewenda.com/c语言结构体直接赋值/ 在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其 ...

  8. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  9. c语言中结构体头文件是什么,函数形参里有结构体指针,为什么在头文件生

    满意答案 lam950 2017.04.08 采纳率:59%    等级:8 已帮助:913人 C语言用结构体指针作函数参数 这种方式比用结构体变量作函数参数效率高,因为无需传递各个成员的值,只需传递 ...

最新文章

  1. BCH智能合约进程持续推进 新方案接连被推出
  2. 数据结构和算法基础概述
  3. 德国精品软件 Steganos Safe 数据加密软件
  4. Google Gson的使用方法及JSON 技术对比
  5. 光谱分类算法 matlab,Matlab K-means聚类算法对多光谱遥感图像进行分类(一)
  6. Android Activity学习笔记——Activity的启动和创建
  7. java解压中文乱码_java使用解压zip文件,文件名乱码解决方案
  8. 使用Maven将文件上传和下载到S3
  9. ggplot2箱式图两两比较_R绘图 第四篇:绘制箱图(ggplot2)
  10. TCP的三次握手过程与四次挥手
  11. WIN10常用快捷键(打开资源管理器、显示桌面、截图)
  12. WPF中的图像处理简介
  13. 伪装Apache版本防止入侵Web服务器
  14. 计算机组成原理pdf在线阅读,计算机组成原理计算机组成原理.pdf
  15. 应聘计算机程序员英文,计算机程序员英文简历模板
  16. 数学分析(9): 不定积分
  17. 新版DAEMON Tools Lite打不开 bin 文件解决方法
  18. rainmeter 修正天气插件信息不准确 设置居住城市
  19. 使用STVP解除STM32flash读出保护
  20. 我的世界空岛生存服务器制作,《我的世界》空岛生存地图玩法 教你如何安全度过前期生存下去...

热门文章

  1. JAVA修炼秘籍(番外篇)第二章:《图书馆管理系统》
  2. 大连华信拒绝东软绣球 双方合并案流产,东软跌停
  3. Fonticon在企业移动APP开发中的应用研究
  4. Packet Tracer has stopped working unexpectedly.
  5. 神策军丨从无到有,从有到优,一直在路上
  6. python入门课程-Coursera上Python课程(公开课)汇总
  7. 工具︱ Web3加密浏览器Brave有什么特别之处?
  8. 微信中如何长按图片保存的是另一张图片
  9. Java 设计模式详解
  10. Arduino+esp8266+1.3寸TFT屏(st7789驱动)显示图片教程