先借用别人的话简单介绍一下三者之间的关联和区别(看到一个博主写的很不错): 我们使用的各种指令,都是写给“编译软件”看的。 要由“编译软件”翻译成计算机可以识别的机器语言,即机器码。
通俗地讲: 就好像召开新闻发布会,主持人用中文讲话,由一个翻译,现场翻译成英文,讲给外国记者听。 主持人说的中文,大部分都是要翻译成英文的;少数几句,是说给翻译听的,告诉他如何翻译。
我们写的指令,由“编译软件”翻译成机器码的,称为指令语句; 有一些是写给“编译软件”看的,不翻译成机器码,这样的就是“伪指令”。
作者:baidu_知道 来源: 原文:https://blog.csdn.net/baidu_33836580/article/details/50578661 版权声明:本文为博主原创文章,转载请附上博文链接!
简单宏: 定义格式: #define 宏标识符 宏体 是最常见的宏,在宏体长的时候使用续行符“\”连接宏体,如示
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ ((PERIPH) == GPIOB) || \ ((PERIPH) == GPIOC) || \ ((PERIPH) == GPIOD) || \ ((PERIPH) == GPIOE) || \ ((PERIPH) == GPIOF) || \ ((PERIPH) == GPIOG))宏的用法:在源文件中,用预处理器伪指令定义过宏标识符后,就可以用宏标识符编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便在宏的所在处将宏扩展为宏体。 参数宏: 定义格式:#define 宏标识符(形式参数表) 宏体 形式参数表为逗号分割的形式参数,宏体可以用“\”进行续行,使用参数宏时形式参数被换为相同个数的实参数表。(类似于函数的调用,实际上许多库函数时用参数宏编写的。二者区别是参数宏的形式参数表中没有类型说明符) 举例如示
#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ ((PIN) == GPIO_Pin_1) || \ ((PIN) == GPIO_Pin_2) || \ ((PIN) == GPIO_Pin_3) || \ ((PIN) == GPIO_Pin_4) || \ ((PIN) == GPIO_Pin_5) || \ ((PIN) == GPIO_Pin_6) || \ ((PIN) == GPIO_Pin_7) || \ ((PIN) == GPIO_Pin_8) || \ ((PIN) == GPIO_Pin_9) || \ ((PIN) == GPIO_Pin_10) || \ ((PIN) == GPIO_Pin_11) || \ ((PIN) == GPIO_Pin_12) || \ ((PIN) == GPIO_Pin_13) || \ ((PIN) == GPIO_Pin_14) || \ ((PIN) == GPIO_Pin_15))预处理器在处理参数宏时使用俩次宏展开。第一次展开宏体,第二次对展开的宏体用实参数替换形式参数。 宏释放: 定义格式: #undef 宏标识符 用于释放原定义的宏标识符,释放后的宏标识符可以再次用于定义其他宏体。 条件宏定义: 条件宏定义主要是用来测试是否定义过某宏标识符,以及决定如何处理宏标识符,具体格式有俩种:
\\测试存在情况 #ifdef 宏标识符 #undef 宏标识符 #define 宏标识符 宏体 #else #define 宏标识符 宏体 #endif \\测试不存在情况 #ifndef 宏标识符 #define 宏标识符 宏体 #else #undef 宏标识符 #define 宏标识符 宏体 #endif常用于头文件中。 预定义宏: 预定义宏基本莫得存在感,其特征就是标识符前后都有双下划线。如
__DATE__ __TIME__ __FILE__ __LINE__ __STDC__这些预定义宏的宏体分别是当时的日期、时间、所在文件名、所在文件的行数。
这些宏在后续的学习阶段会频繁出现,在此总结一下。