说到伪指令宏一般就会联想到指令、宏指令和伪指令。
先借用别人的话简单介绍一下三者之间的关联和区别(看到一个博主写的很不错):
我们使用的各种指令,都是写给“编译软件”看的。
要由“编译软件”翻译成计算机可以识别的机器语言,即机器码。
通俗地讲:
就好像召开新闻发布会,主持人用中文讲话,由一个翻译,现场翻译成英文,讲给外国记者听。
主持人说的中文,大部分都是要翻译成英文的;少数几句,是说给翻译听的,告诉他如何翻译。
我们写的指令,由“编译软件”翻译成机器码的,称为指令语句;
有一些是写给“编译软件”看的,不翻译成机器码,这样的就是“伪指令”。
一条条计算机的指令,一般来说,功能都是极为简单的。我们可以把几条、几十条指令,编写成一个“宏指令”,来完成一个比较复杂的任务。
在这样“一批指令”的前面,要用一条“伪指令”来命名这个“宏指令”;
在后面,要用一条“伪指令”说明结尾。
以后,这个“宏指令”,就可以当成 正式指令 来使用了。
2.伪指令宏分为简单宏、参数宏、条件宏、预定义宏和宏释放
简单宏:
定义格式: #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__
这些预定义宏的宏体分别是当时的日期、时间、所在文件名、所在文件的行数。
这些宏在后续的学习阶段会频繁出现,在此总结一下。
上一篇:STM32—ADC多通道采集电压
下一篇:【FDCAN】STM32G0B1+FDCAN+HAL库调试记录
推荐阅读
史海拾趣
随着全球环保意识的日益增强,Bel Power Solutions积极响应号召,将环保理念融入产品设计和生产中。公司推出了多款环保型电源产品,如高效能、低能耗的DC-DC转换器和电源供应器,帮助客户降低能耗、减少碳排放。同时,公司还致力于研发和推广可再生能源应用技术,为可持续发展做出贡献。
Antenna Factor公司始终注重产品质量和客户体验。他们建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的把控。同时,公司还加强了对售后服务的管理和改进,确保客户在使用过程中能够得到及时、有效的支持。这些举措使得Antenna Factor公司的产品质量和品牌形象得到了显著提升。
在快速发展的过程中,Erocore意识到供应链管理的重要性。公司开始优化供应链流程,降低采购成本,提高生产效率。通过与供应商建立长期稳定的合作关系,Erocore在保证产品质量的同时,实现了成本的有效控制。这一举措为公司在激烈的市场竞争中赢得了更多的优势。
成谷科技是一家专注于ETC技术在区域市场应用的企业。公司根据不同地区的交通特点和需求,量身定制ETC解决方案,并在当地市场进行深耕细作。通过深入了解当地市场和客户需求,成谷科技成功打造了一系列具有地方特色的ETC应用案例,赢得了当地政府和客户的广泛赞誉。
金溢科技是国内ETC行业的领军企业之一。公司自创立之初,就致力于ETC技术的研发与应用。通过不断的技术创新,金溢科技成功推出了多款具有自主知识产权的ETC设备,并在市场中获得了广泛应用。同时,公司还积极参与国家标准的制定和修订工作,推动ETC行业的规范化发展。金溢科技凭借其在ETC领域的卓越表现,逐渐成为了行业的标杆企业。
1991年,高通的CDMA技术首次被商用于美国卫星通信公司的无线电话网,标志着高通在移动通信领域的重大突破。与此同时,高通开始向智能手机芯片方向转型,目标是利用芯片技术使手机具备更强大的计算能力。随着技术的不断成熟,高通推出了多款性能卓越的移动应用处理器,如Snapdragon系列,迅速占据了智能手机芯片市场的主导地位。这一转型不仅巩固了高通在移动通信领域的地位,也为公司的长期发展奠定了坚实基础。
我在linux下开发短信,使用开源的smstools来开发。 使用pdu模式时,发现对英语与数字可以很简单地实现。 但使用中文信息时,发现移动发过来的pdu报文解不正确。 如报文:测试 =“6D4B8BD5” 将两位一组转换为16进制数值,再转换为无符号字符。 ...… 查看全部问答∨ |
各位大哥,你们好,我的朋友想学习plc但不知道用什么开发工具,希望你们能提供一些信息!谢谢 各位大哥,你们好,我的朋友想学习plc但不知道用什么开发工具,希望你们能提供一些信息!谢谢… 查看全部问答∨ |
最近再使用STM8S207RB进行开发,以下是自己使用cosmic时遇到的一些常见问题: 1.printf/sprintf入口参数必须是u16类型,否则打印结果不正确,很奇怪 2.u32位类型的判断if ((val%0x1000) == 0)此判断前必须强制转换,即 if ((u ...… 查看全部问答∨ |
|
笔试的一个题,挂了!回家的路上突然想到答案,呜呼哀哉~~请各路诸侯给出高见 问题:执行下列代码会有什么结果 #include <stdio.h> char *fun(void) { char p[] = "hello, world"; return p; } void main() { &nb ...… 查看全部问答∨ |
本帖最后由 dontium 于 2015-1-23 11:26 编辑 内容推荐 本书主要从设计者的思维的角度来展开叙述。但和别的讲设计的书籍显著的不同的在于:本书不讲某个专题,而是注重描述设计的整个过程的思维方式和解决问题的方法。本书作为一个讲述电子 ...… 查看全部问答∨ |