C语言中结构体标签的使用
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语言中结构体标签的使用相关推荐
- Go语言中结构体打Tag是什么意思?
前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...
- Go语言中结构体打 Tag 是什么意思?
前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...
- C 语言中结构体强制转换--实验
2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...
- java发送c语言结构体_C语言中结构体直接赋值?
在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...
- c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配
#include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...
- c语言定义学生结构体类型,C语言中结构体的三种定义方式
c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 ...
- C语言中结构体直接赋值
FROM:http://codewenda.com/c语言结构体直接赋值/ 在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其 ...
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
- c语言中结构体头文件是什么,函数形参里有结构体指针,为什么在头文件生
满意答案 lam950 2017.04.08 采纳率:59% 等级:8 已帮助:913人 C语言用结构体指针作函数参数 这种方式比用结构体变量作函数参数效率高,因为无需传递各个成员的值,只需传递 ...
最新文章
- BCH智能合约进程持续推进 新方案接连被推出
- 数据结构和算法基础概述
- 德国精品软件 Steganos Safe 数据加密软件
- Google Gson的使用方法及JSON 技术对比
- 光谱分类算法 matlab,Matlab K-means聚类算法对多光谱遥感图像进行分类(一)
- Android Activity学习笔记——Activity的启动和创建
- java解压中文乱码_java使用解压zip文件,文件名乱码解决方案
- 使用Maven将文件上传和下载到S3
- ggplot2箱式图两两比较_R绘图 第四篇:绘制箱图(ggplot2)
- TCP的三次握手过程与四次挥手
- WIN10常用快捷键(打开资源管理器、显示桌面、截图)
- WPF中的图像处理简介
- 伪装Apache版本防止入侵Web服务器
- 计算机组成原理pdf在线阅读,计算机组成原理计算机组成原理.pdf
- 应聘计算机程序员英文,计算机程序员英文简历模板
- 数学分析(9): 不定积分
- 新版DAEMON Tools Lite打不开 bin 文件解决方法
- rainmeter 修正天气插件信息不准确 设置居住城市
- 使用STVP解除STM32flash读出保护
- 我的世界空岛生存服务器制作,《我的世界》空岛生存地图玩法 教你如何安全度过前期生存下去...
热门文章
- JAVA修炼秘籍(番外篇)第二章:《图书馆管理系统》
- 大连华信拒绝东软绣球 双方合并案流产,东软跌停
- Fonticon在企业移动APP开发中的应用研究
- Packet Tracer has stopped working unexpectedly.
- 神策军丨从无到有,从有到优,一直在路上
- python入门课程-Coursera上Python课程(公开课)汇总
- 工具︱ Web3加密浏览器Brave有什么特别之处?
- 微信中如何长按图片保存的是另一张图片
- Java 设计模式详解
- Arduino+esp8266+1.3寸TFT屏(st7789驱动)显示图片教程