1.Typedef
typedef用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。typedef在MDK用得最多的就是定义结构体的类型别名和枚举类型了。

如:typedef struct

{u16 seq_num;u16 len;u8 dev_id[GPRS_PRO_DEVICE_ID];u16 command_id;u8 *pro_data;
}gprs_pro_cmd_t;

然后我们就可以直接使用gprs_pro_cmd_t定义一个结构体变量。

2.结构体
① 一般形式:Struct 结构体名 { 成员列表; }变量名列表;
② 这样是声明后直接定义,也可以先声明,后定义;
如:
Struct 结构体名字 { 成员列表; };
例如:struct U_TYPE usart1,usart2;
注意:结构体指针成员变量引用方法是通过“->”符号实现;
运用:在我们定义函数的形参时,形参数量较多的情况下,一旦修改就会很麻烦。因此将形参使用结构体进行统一定义,进行组合。

typedef struct{uint32_t USART_BaudRate;
uint16_t USART_WordLength;
uint16_t USART_StopBits;
uint16_t USART_Parity;
uint16_t USART_Mode;
uint16_t USART_HardwareFlowControl;}USART_InitTypeDef;

于是,我们在初始化串口的时候入口参数就可以是USART_InitTypeDef类型的变量或者指针变量了,MDK中是这样做的:

void USART_Init(USART_TypeDef*USART_InitTypeDef*USART_InitStruct);

这样,任何时候,我们只需要修改结构体成员变量,往结构体中间加入新的成员变量,而不需要修改函数定义就可以达到修改入口参数同样的目的了。

3.宏定义

宏定义是一种预处理命令,便于代码可读性

在C语言的宏定义中,偶尔会碰到#和##符号的使用,如下

#ifndef MKSTR
#define MKSTR(x) #x
#endif#define CAR_SECTION __attribute__((used,section("car")))
#define CAR(__name,__owner,__price) \static car  car##__name CAR_SECTION = {\.name= MKSTR(__name),\.owner = MKSTR(__owner),\.price = __price,\}#endif

1、#:表示将宏定义中的参数转换成字符串

例如上面的MKSTR(__name),展开后是#__name, 是将宏参数转换成字符串。这样就可以赋值给.name这个成员变量了。

2、##:表示连接,即将前后书写的字符连接起来。

例如上面的car##__name, 当宏参数宏参数__name为 Elec时,展开的该部分就是 carElec.

##就像个粘合剂,将前后两部分粘合起来。但是“##”不能随意粘合任意字符,必须是合法的C语言标示符。

4.条件编译

条件编译是一种宏定义,故有#,它的目的就是防止函数二次定义
最常用的方式就是
#ifndefine //如果未定义此函数
#define //则定义它
续行符
语法:“\”
表示续行符的下一行与续行符所在的代码是连接起来
应用续行符的时候要注意,在“\”后面不能有任何字符(包括注释、空格),只能直接回车

实际应用场景:

1、固件库里面有一个很重要的头文件,叫stm32f10x.h,这个头文件实现了外设寄存器的映射,相当于51单片机中的reg51.h

2、这个头文件会被很多文件包含调用,那就意味着stm32f10x.h的头文件会被多次包含,文件里面的那些寄存器结构体声明就会出现重复声明的错误

3、那为了防止头文件被重复包含时出现函数或者变量重复定义的情况,我们可以通过条件编译来解决

#ifndef  __STM32F10X_H#define __STM32F10X_H// stm32f10x.h 头文件的真正内容#endif   /* __STM32F10X_H */

比如,stm32f10x.h被stm32f10x_gpio.h和stm32f10x_usart.h这两个固件库的头文件包含了,那么首次编译的时候就会判断是否定义了__STM32F10X_H,那第一次肯定是没有定义的,那紧接着就定义__STM32F10X_H,

当编译到第二个头文件也包含了stm32f10x.h时,因为__STM32F10X_H 已经被定义过,stm32f10x.h的内容就不会再编译一次。

因此,不管是固件库头文件还是我们自己用户编写头文件的时候,为了养成好的习惯,都必须在头文件上加上条件编译。

STM32学习第二课:STM32c语言基础2相关推荐

  1. 第二课--C语言基础(1,2部分--共三部分)

    目录 0,课前问题总结 1,C语言基础 1.1,变量 1.2,指针 1.3,关键字 1.4,语句 1.5,函数的写法 2,C代码在SDK中的使用 2.1,变量与内存地址的查看 2.2,指针简单的使用( ...

  2. 第二课--C语言基础(3部分--共三部分)

    0,前言 这节课程可以说手把手教程写C代码.具体看的过程不是很理解,但后来又反复看了几遍,还是可以理解的.这里进行一下课程总结. 首先这节课使用EMIO进行控制PL部分.使其数据发生变化(直接控制LE ...

  3. java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础

    第二章 JAVA语言基础 一.关键字 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有的字母都为小写 2.用于定义数据类型的关键字 c;ass  interface ...

  4. 开始Python学习第二课(python环境安装)

    *** 开始Python学习第二课*** 一. Python语言简介 1. Python语言 1.1 Python的命名 2. Python基本概念 2.1 Python的简单介绍 2.2 Pytho ...

  5. 第二章 Mablab语言基础

    第二章 Mablab语言基础 2.1 Matlab的变量与常量 1) input:x=input('please enter a numb') 2) Inf/inf:正无穷大 3) pi:圆周率 4) ...

  6. JavaScript学习 第二课(二)

    JavaScript学习 第二课(二) 一.Math对象: 该对象的作用是用来处理数学运算符的,该对象不需要手动创建,因为它是window对象的一个属性,当页面加载完毕后,后台就是自动创建Math对象 ...

  7. Python-opencv学习第二课:图像色彩

    Python-opencv学习第二课:图像色彩 文章目录 Python-opencv学习第二课:图像色彩 一.学习内容 二.代码部分 NOTES:上一课代码改善(第一课) 1.引入库(第二课内容开始) ...

  8. python语言中、用来表示赋值的符号是_第二章Python语言基础知识

    第二章Python语言基础知识 2.1 Python语言基础知识 2.1.1标识符与关键字 在Python语言中,对程序中各个元素命名加以区分,这种用来标识变量.函数.类等元素的符号称为标识符. Py ...

  9. as3学习第二课 显示对象和显示列表

    关于显示对象 原文地址:as3学习第二课   显示对象和显示列表 作者:冰剑蓝影 一.显示对象    显示对象就是可以在舞台上显示的对象.包括直接看到的对象,如图形.文字.图片.视频.还有看不到但又真 ...

最新文章

  1. 基础练习 杨辉三角形
  2. 006_Topic消息模式发送对象消息
  3. ubuntu phpstorm 安装xdebuger
  4. 双色球随机选号器界面设计及功能实现
  5. Iptables防火墙配置
  6. 8-18-Exercise
  7. python 进程与线程(理论部分)
  8. 利用T-SQL动态定义重复SQL Server数据库表行
  9. iOS利用HealthKit框架从健康app中获取步数信息
  10. [自动调参]深度学习模型的超参数自动化调优详解
  11. 每天Leetcode 刷题 初级算法篇-数学问题-3的幂
  12. maskrcnn ImportError: cannot import name ‘_C‘
  13. 【Windows】六种正确清理C盘的方法,解决你的红色烦恼
  14. Verilog数码显示器00~99循环计数器电路
  15. RP网页设计中的默认字体:{font: 12px/1.5 Tahoma, Helvetica, Arial, sans-serif;}
  16. 数据库之视图和触发器
  17. PS自动批量处理文件夹下所有文件
  18. “创享杯”第一届电子数据取证线上大比武答案(自做)
  19. 基于极限学习机的预测、图像降噪和回归
  20. 被评为“影响世界千年的物理学家”,杨振宁的伟大,你根本不了解

热门文章

  1. 2021年中国以文档为中心的协作Softwar市场趋势报告、技术动态创新及2027年市场预测
  2. Docker终失C位,开源少年缘何黑化
  3. 重识 SQLite,简约不简单
  4. OpenAI 发布模型实现自动定理证明,妈妈再也不用担心我的数学?
  5. 首届“马栏山杯”国际音视频算法优化大赛 马栏山上绽放智能之花
  6. 程序员之痛:六次创业五回失败了
  7. 如何“发现”失联多年好友?代码告诉你!
  8. 从鲁班造木鸢到智能控制,图解世界无人机发展简史
  9. 五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?| 原力计划
  10. 面试稳了!网易资深工程师详解运维面经!