【C语言】宏定义 结构体 枚举变量的用法

简介: 【C语言】宏定义 结构体 枚举变量的用法

补充学习一点STM32的必备基础知识

一、数据类型

231f4d058e7cb3afe400afd110c5c9cb_833be1e300e1486bbca73c6c2ca1d408.png

二、C语言宏定义

关键字:#define

  • 用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改
  • 定义宏定义: #define ABC 12345
  • 引用宏定义: int a = ABC; //等效于int a = 12345;

三、C语言typedef重命名

关键字:typedef

  • 用途:将一个比较长的变量类型名换个名字,便于使用
  • 定义typedef: typedef unsigned char uint8_t;
  • 引用typedef: uint8_t a; //等效于unsigned char a;

四、 #define与typedef的区别

  • typedef最后加分号,#define 不用加
  • typedef新名字在右边,#define 新名字在左边
  • 宏定义任何名字都可以换,typedef只能替换变量类型
  • 宏定义无脑改名,范围更宽,typedef重命名变量类型更安全
  • 重命名是增加了一个新名字,原来的名字仍然可以继续使用
    unsigned char a; uint_t a; u8 a; 都可以

五、结构体

关键字:struct

  • 用途:数据打包,不同类型变量的集合
  • 定义结构体变量: struct{char x; int y; float z;} c;
  • struct声明结构体类型,花括号中间是要打包的变量类型,最后是结构体名,最后加分号
  • 结构体的引用
    c.x = 'a'; //c.x调用这个结构体
    c.y = 1;
    c.z = 6.66;
  • 因为结构体变量类型较长,所以通常用typedef更改变量类型名引用结构体成员
  • typedef struct{char x;int y;float z;} StructName //把这个结构体重命名为 StructName
    下次定义结构体: 比如StructName GPIO_Init; //结构体数据类型 结构体变量名称
    GPIO_Init是声明结构体名称,用 引出元素

为了形式美观好看,常见结构体格式如下

1. typedef struct{
2.     char x; //数据类型
3.     int y;
4.     float z;
5. } StructName; //最后是结构体数据类型

直接用结构体变量名 用 点 引出数据

引出结构体成员的第二种方式

pStructName -> x = 'A'; //用地址的方式引出结构体成员

举例说明:

1. typedef struct
2. {
3.   uint16_t GPIO_Pin; 
4.   GPIOSpeed_TypeDef GPIO_Speed; 
5.   GPIOMode_TypeDef GPIO_Mode;
6. }GPIO_InitTypeDef;

在结构体中声明所需要的变量类型以及变量,进行打包

然后重新起名字,调用

1. GPIO_InitTypeDef GPIO_InitStructure;
2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
3. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Speed 和 GPIO_Mode又用到了枚举变量

六、枚举变量

关键字:enum

用于定义一个取值受限制的整型变量,用于限制变量的取值范围

定义枚举变量 举例 enum{MONDAY = 1,TUESDAY = 2;WEDNESDAY = 3} week;

中间用逗号,后边的week是变量,本变量取值范围在1-3(花括号内的值)

typedef改名:

1. typedef enum{
2.     MONDAY = 1,
3.     TUESDAY = 2,
4.     WEDNESDAY = 3
5. }week_t;     //week_t是变量类型名

再定义枚举变量 week_t week

week = MONDAY ; //只能按照定义类型 来赋值

枚举值也可以赋值给别的变量

结构体中提到了 GPIO_Speed 和 GPIO_Mode,它们都是枚举变量

1. typedef enum
2. { 
3.   GPIO_Speed_10MHz = 1,
4.   GPIO_Speed_2MHz, 
5.   GPIO_Speed_50MHz
6. }GPIOSpeed_TypeDef;
7. 
8. typedef enum
9. { GPIO_Mode_AIN = 0x0,
10.   GPIO_Mode_IN_FLOATING = 0x04,
11.   GPIO_Mode_IPD = 0x28,
12.   GPIO_Mode_IPU = 0x48,
13.   GPIO_Mode_Out_OD = 0x14,
14.   GPIO_Mode_Out_PP = 0x10,
15.   GPIO_Mode_AF_OD = 0x1C,
16.   GPIO_Mode_AF_PP = 0x18
17. }GPIOMode_TypeDef;

9b370efe61258768055dbef9d0921328_7dbdc052fcdb46ac9e8e5c2d5d52664b.gif

 

相关文章
|
7天前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
21小时前
|
编译器 程序员 Linux
【C语言篇】结构体和位段详细介绍
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。
|
22小时前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
|
21小时前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
|
22小时前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
|
1天前
|
存储 编译器 C语言
【C语言篇】C语言数据类型和变量
我们使⽤强制类型转换都是万不得已的时候使用,如果不需要强制类型转化就能实现代码,这样⾃然更好的.
|
6天前
|
存储 C语言
C语言------结构体和共用体
这篇文章是关于C语言中结构体和共用体的实训,通过示例代码演示了结构体的定义、赋值、使用,以及如何使用结构体变量进行数据的组织和操作,包括输入、排序、求平均分和查找学生信息等功能。
C语言------结构体和共用体
|
11天前
|
C语言
C语言数据类型和变量
C语言数据类型和变量
19 5
|
3天前
|
存储 C语言 容器
C语言中的变量作用域
C语言中的变量作用域
|
1月前
|
存储 编译器 C语言
C语言3 变量
C语言3 变量
12 1