【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

 

相关文章
|
20天前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
182 1
一文彻底搞清楚C语言的数据类型和变量
|
3月前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
266 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
2月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
56 19
|
2月前
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
69 4
|
3月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
99 12
|
3月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
239 14
|
3月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
233 10
|
3月前
|
编译器 C语言
【C语言】宏定义详解
在C语言中,宏定义是一种强大的预处理器功能,用于在编译之前对代码进行替换和条件编译。宏定义通过预处理器指令进行定义和使用,能够使代码更加灵活和可维护。本文将对C语言中的宏定义进行全面的讲解,包括各种相关的预处理器指令及其用法。
182 7
|
3月前
|
编译器 C语言
【C语言】宏定义详解
宏定义(Macro Definition)是C语言预处理器的一部分,通过`#define`指令引入。宏定义在编译前的预处理阶段进行文本替换,即将代码中的宏名替换为定义的内容。
564 6
|
3月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
60 5