C 语言编程 — 数据类型的别名
目录
文章目录
- 目录
- 前文列表
- typedef
- 关键字 typedef 和预处理器指令 #define 的区别
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
《C 语言编程 — 高级数据类型 — 数组》
《C 语言编程 — 高级数据类型 — 字符串》
《C 语言编程 — 高级数据类型 — 枚举》
《C 语言编程 — 高级数据类型 — 结构体与位域》
《C 语言编程 — 高级数据类型 — 共用体》
《C 语言编程 — 高级数据类型 — void 类型》
typedef
在 C/C++ 编程语言中,typedef
关键字用来为特定的数据类型取一个别名,或者将其称之为 “定义了一种新的数据类型”。无论如何,其最终的目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的数据类型组成的结构 。
比如,在 C 中没有 bool 类型,于是很可能出现一个程序员使用 int,一个程序员使用 short 的情况,会比较混乱。这时最好使用一个 typedef 来定义一个统一的 bool 类型:
typedef char bool_t;
_t 表示这些数据类型是通过 typedef 来定义的,而不是新的数据类型。也就是说,它们其实是我们已知的数据类型的别名。这样就便于代码的维护。
另外,在涉及到跨平台时,不同的平台会有不同的字长,所以利用预编译和 typedef 可以方便的维护代码,例如:uint8_t、uint16_t 等。
typedef signed char int8_t;
typedef short int int16_t;
- 创建 BYTE 作为无符号单字符类型的别名
typedef unsigned char BYTE;// 使用自定义的数据类型 BYTE 来定义无符号单字符类型变量
BYTE b1, b2;
- 创建函数指针 PFI 的别名
typedef int (*PFI)(char *, char *);
也可以使用 typedef 来为自定义的数据类型取一个新的名字,例如:可以对结构体使用 typedef 来定义一个新的别名(数据类型),然后使用这个新的数据类型来直接定义结构变量:
#include <stdio.h>
#include <string.h>typedef struct BOOKS {char title[50];char author[50];char subject[100];int id;
} MyBook;int main() {MyBook book1;strcpy(book1.title, "C");strcpy(book1.author, "Runoob");strcpy(book1.subject, "C");book1.id = 123;printf("Book's title: %s\nauthor: %s\nsubject: %s\nid: %d\n", book1.title, book1.author, book1.subject, book1.id);return 0;
}
关键字 typedef 和预处理器指令 #define 的区别
#define 是 C 的预处理器指令,也称之为 C 指令,用于为各种数据类型定义别名,与关键字 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于自定义数据类型标识符的别名,#define 不仅可以为数据类型定义别名,也能为实际的数值定义别名。
- typedef 是由编译器处理的,#define 语句是由预处理器进行处理的。
#include <stdio.h>/* 自定义常量 */
#define TRUE 1
#define FALSE 0int main() {printf( "TRUE 的值: %d\n", TRUE);printf( "FALSE 的值: %d\n", FALSE);return 0;
}
C 语言编程 — 数据类型的别名相关推荐
- C 语言编程 — 指令行参数
目录 文章目录 目录 前文列表 命令行参数 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...
- C 语言编程 — 编程实践
目录 文章目录 目录 前文列表 程序示例 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...
- C 语言编程 — 编程规范
目录 文章目录 目录 前文列表 排版 注释 头文件 函数 标识符命名与定义 变量 宏.常量 代码逻辑 内存操作 日志打印 质量保证 单元测试 断言 安全性 可移植性 参考文档 前文列表 <程序编 ...
- C 语言编程 — GDB 调试工具
目录 文章目录 目录 前文列表 代码调试 GDB 启动 GDB 交互命令 运行程序 暂停程序 设置断点 设置观察点 设置捕捉点 打印信息 查询运行信息 分割窗口 前文列表 <程序编译流程与 GC ...
- C 语言编程 — 堆栈与内存管理
目录 文章目录 目录 前文列表 栈(Stack)和堆(Heap) 栈 堆 内存管理 动态分配内存 重新调整内存的大小和释放内存 malloc 函数详解 memset 初始化内存数据 前文列表 < ...
- C 语言编程 — 输入/输出与文件操作
目录 文章目录 目录 前文列表 输入/输出 scanf() 和 printf() getchar() 和 putchar() 文件操作 打开文件 关闭文件 写入文件 读取文件 二进制 I/O 函数 前 ...
- C 语言编程 — 头文件
目录 文章目录 目录 前文列表 头文件 只引用一次头文件 有条件引用 global.h 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C ...
- C 语言编程 — 异常处理
目录 文章目录 目录 前文列表 异常处理 perror() 和 strerror() 输出异常信息 程序退出状态 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基 ...
- C 语言编程 — 宏定义与预处理器指令
目录 文章目录 目录 前文列表 宏 预处理器 预处理器指令 预处理器指令示例 预处理器指令运算符 宏定义 简单宏定义 带参数的宏定义 符号吞噬问题 使用 do{}while(0) 结构 预定义的宏 常 ...
最新文章
- C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统摘要信息查看功能...
- python 实现ping测试延迟的两种方法
- 一些机器学习数据集(Dataset)
- matlab四维图程序,Matlab 四维图形绘制
- win10主题更换_还不升级? win10精简版不到10G,运行比win7还快,旧电脑的福音
- JavaScript获取URL参数
- java mod函数的使用方法_java 数学计算的具体使用
- SpringBoot项目中图片的引用
- 电脑主机箱前置耳机没声音(window7)
- 前端背景图放置_css如何设置背景图片?background属性添加背景图片
- html工作周报,可查看(周报).html
- 2021年西式面点师(初级)考试题及西式面点师(初级)免费试题
- TIM新版支持微信扫码登录:自动生成新QQ
- (C++题目)定义一个描述学生基本情况的类Student,数据成员包括姓名、学号、英语成绩和高数成绩;成员函数包括构造函数、析构函数、获取姓名、获取学号、求出平均成绩,以及显示各
- Repulsion Loss: Detecting Pedestrians in a Crowd 详解(遮挡下的行人检测)
- 五子棋胜负判定c 语言,【C语言】五子棋胜负判定算法及源代码
- 报错信息 terminate called after throwing an instance of ‘std::cad_alloc‘ what():std::bad_alloc
- 监察对象是否应该包含机关本身
- 数字集成电路设计---除法运算
- Blender - Texture Paint 下的笔刷简单应用
热门文章
- OpenVAS漏洞扫描基础教程之创建用户
- Wireshark网络分析实例集锦第2章设置Wireshark视图
- python管理系统pyqt_pyqt5图书管理系统(源码+安装说明+数据库)
- zabbixdocker里的mysql_Zabbix Docker
- requestmapping默认是get还是post_编写Spring MVC控制器的14个技巧,你今天get到了吗?...
- 机器学习算法_五分钟了解机器学习十大算法
- iOS UILabel加载html点击图片查看大图 附demo
- 集合php,PHP问题集合
- 上海交大研究人员使用非侵入性脑机接口和计算机视觉引导对机器人手臂进行共享控制...
- 早上醒来收获一个Surprise,成为CSDN博客专家了