0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

"最常见"却又"最不常用"的三个预编译

Q4MP_gh_c472c21 来源:最后一个bug 作者:bug菌 2020-11-16 15:55 次阅读

1

#error 与#warning

谈到预编译大家常用的有#if、#else、#ifdef、#ifndef、#endif等等条件编译选项。

然而在我们阅读一些大型的代码或者库的时候,一般都会看到有#error和#warning,可能有些小伙伴一扫而过并没有了解清楚这些预编译指令到底该怎么用,写了很久的代码估计也重来没有敲过他们。

#error / #warning

形式 :#error / #warningmessage

作用 :生成一个编译错误事件并停止编译/发出警告信息

注意 :message可以不需要双引号。

参考demo:

#include #include //#defineconfigUART_N5 #ifndefconfigUART_N #errorconfigUART_Nmustdefine //#error"configUARTmustdefine" //#warning"configUARTmustdefine" #endif #ifconfigUART_N>4 #errorconfigUART_Nmustnotbelessthan4 //#error"configUART_Nmustnotbelessthan4" //#warning"configUART_Nmustnotbelessthan4" #endif /*************************************** *Fuction:进行预编译测试 *Author:(最后一个bug) **************************************/ intmain(intargc,char*argv[]){ printf("公众号;最后一个bug "); return0; }

输出结果:

编译失败,无法生成可执行文件

上面是放开宏,且使用warning的情况,无其他错误的情况下可以生成可执行文件。

解释一下:

通过上面的测试代码可以了解到,通过配合条件预编译#if等,#error和#warning能够在编译过程中分别以错误和告警的形式提醒开发人员注意相关代码设计问题,从而保证代码正确性。

这样对于发布一些庞大的库代码时,为了让开发人员正确的使用库,这些提示会帮助他更好的移植代码。

那么经常有很多小伙伴编译出来的代码有一大堆warning,总是觉得warning关系不大,然而warning也是分不同类型的,对于一些未使用的变量倒关系不大,其他情况还是要认真对待,最好是做到"0 Error,0 warning".

2

#undef

#undef标识符用于把前面的宏定义名取消,别看这宏用得不多,作用可大着呢,下面我简单举几个例子:

1

局部宏定义

一旦定义了宏,那么该文件中往下所有的代码都可以使用该宏,即使是函数内部,这样导致宏比较混乱,如下面代码:

参考demo:

#include #include #defineconfigRatio10 /*************************************** *Fuction:获得传感器电压值 *Author:(最后一个bug) **************************************/ intGetSensorVolt(void) { #defineconfigRatio1 intret=0; ret=configRatio*1024;//比例因子*AD值 returnret; //#undefconfigRatio } /*************************************** *Fuction:获得传感器电压值 *Author:(最后一个bug) **************************************/ intGetSensorCurr(void) { #defineconfigRatio2 intret=0; ret=configRatio*1024;//比例因子*AD值 returnret; //#undefconfigRatio } /*************************************** *Fuction:进行预编译测试 *Author:(最后一个bug) **************************************/ intmain(intargc,char*argv[]){ printf("configRatio=%d ",configRatio);//报宏未定义 printf("GetSensorVolt=%d ",GetSensorVolt()); printf("GetSensorCurr=%d ",GetSensorCurr()); printf("公众号;最后一个bug "); return0; }

输出结果:

解释一下:

假如我们没有注意到函数内部的同名宏定义,当然告警也没管,那么在main函数中使用同名宏定义就可能不是我们期待的最上面的宏定义,造成程序bug。

所以我们可以使用#undef来限制每个宏的作用域,如果每个函数内部都使用了#undef,那么main函数中再使用会报宏没有定义,这样便可以找到问题,当然也可以通过警告了解到。

2

选择接口

通过宏来切换不同的接口供程序使用:

参考demo:

#include #include #include #defineDEV_SPI #include"Drive.h" #undefDEV_SPI /*************************************** *Fuction:进行预编译测试 *Author:(最后一个bug) **************************************/ intmain(intargc,char*argv[]){ char*strbug="thelastbug"; SendData(strbug); ProcessData(strbug); printf("公众号;最后一个bug "); return0; }

#include #ifdefDEV_UART #defineSendData(s)printf("UARTSend:%s ",s) #defineProcessData(s)printf("UARTProcess:%s ",s) #endif #ifdefDEV_CAN #defineSendData(s)printf("CANSend:%s ",s) #defineProcessData(s)printf("CANProcess:%s ",s) #endif #ifdefDEV_SPI #defineSendData(s)printf("SpiSend:%s ",s) #defineProcessData(s)printf("SpiProcess:%s ",s) #endif

输出结果:

3

自定义接口

当多个人维护一套代码的时候,有些同事喜欢调用库函数接口,而有些同事喜欢调用自定义接口,为了方便统一使用自定义接口或者库接口,我们会进行如下操作:

参考demo:

#include #include #include #include"Drive.h" //#undefprintf /*************************************** *Fuction:进行预编译测试 *Author:(最后一个bug) **************************************/ intmain(intargc,char*argv[]){ char*strbug="thelastbug"; printf("公众号;最后一个bug "); return0; }

#ifndef__DRIVE_H__ #define__DRIVE_H__ #defineprintfprintf("pleaseuseKprintf! "); externvoidKprintf(char*str); #endif

输出结果:

这样下面的代码你就只能够使用Kprintf来进行输出打印,而当我们放开注释掉的宏,这样就又可以使用printf了,还是比较方便的。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4717

    浏览量

    68200
  • 编译
    +关注

    关注

    0

    文章

    648

    浏览量

    32765

原文标题:"最常见"却又"最不常用"的三个预编译

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    对称相电压的特点是哪三个方面

    对称相电压是电力系统中常见的一种电压形式,它具有三个相位,每个相位之间的相位差为120度。对称相电压在工业生产和日常生活中有着广泛的应用,如电动机、变压器、发电机等。本文将从
    的头像 发表于 08-12 18:18 773次阅读

    可调变阻器三个引脚怎么区分

    可调变阻器,也称为电位器或可变电阻器,是一种可以调节电阻值的电子元件。它广泛应用于各种电子设备中,如音频设备、电源管理、电机控制等。可调变阻器有三个引脚,分别是固定端、滑动端和可调端。这三个引脚
    的头像 发表于 07-24 11:12 747次阅读

    微波测量的三个基本参量是什么

    和性能评估具有重要意义。本文将详细介绍这三个基本参量的基本概念、测量原理和方法,以及在微波测量中的应用。 一、频率 1.1 频率的定义 频率是描述信号周期性变化快慢的物理量,通常用赫兹(Hz)作为单位。在微波测量中,频率
    的头像 发表于 05-28 14:46 994次阅读

    STVD中如何设置预编译选项?

    请问大家一IDE 的问题 我目前使用的是STVD 的编译器。 想请问一下, 预编译选项 哪里有的设置。 例如 在 中断向量 文件中如果 定义了STM8S208 就开
    发表于 05-13 07:30

    篱笆三个桩——记晶体极管的发明

    篱笆三个桩——记晶体极管的发明
    的头像 发表于 05-12 08:14 609次阅读
    一<b class='flag-5'>个</b>篱笆<b class='flag-5'>三个</b>桩——记晶体<b class='flag-5'>三</b>极管的发明

    鸿蒙OpenHarmony:【常见编译问题和解决方法】

    常见编译问题和解决方法
    的头像 发表于 05-11 16:09 1834次阅读

    PCB板的颜色应该怎么选?为什么绿色最常见

    使用的,更为人熟悉。但是不同的PCB我们应该怎么去选择PCB的颜色呢,为什么绿色更常用呢?1绿色PCB板绿色是最常见的PCB颜色,也是最经济、使用最广泛的选择。这是因为在传
    的头像 发表于 05-10 08:20 794次阅读
    PCB板的颜色应该怎么选?为什么绿色<b class='flag-5'>最常见</b>?

    OpenHarmony开发学习:【源码下载和编译

    本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(`Hi3516`,`Hi3518`和`Hi3861`)的编译环境,以及如何将源码编译
    的头像 发表于 04-14 09:36 844次阅读
    OpenHarmony开发学习:【源码下载和<b class='flag-5'>编译</b>】

    最常见的直流负载工作方式

    的直流负载工作方式。 1. 固定电阻负载 固定电阻负载是最简单和最常见的直流负载方式之一。它由一或多个电阻器组成,用于产生一恒定的电阻值,从而使电路中的电流保持稳定。这种负载常用
    的头像 发表于 01-18 15:12 659次阅读

    欧姆定律三个公式应如何计算

    欧姆定律是电路中的一种基本关系,用于描述电压、电流和电阻之间的关系。根据欧姆定律,当电流通过一导体时,电流与电压成正比,与电阻成反比。在这篇文章中,我们将详细介绍欧姆定律的三个公式:电流公式、电压
    的头像 发表于 01-10 13:53 2610次阅读

    相异步电机最常用的启动方式是什么?

    现在相异步电机,最常用的启动方式怎么启动?
    发表于 12-13 06:50

    if函数三个条件怎么填

    IF函数是Excel中最常用的函数之一,它根据一逻辑条件的返回结果来决定应该执行哪一动作。在Excel中使用IF函数可以实现复杂的逻辑判断,应用范围广泛。本文将详细解析IF函数的三个
    的头像 发表于 12-03 10:28 3400次阅读

    linux关机的三个命令

    在Linux系统中,常用的关机命令有三个:shutdown、poweroff和halt。下面是对这三个命令的详细解释: shutdown命令 shutdown命令用于在指定的时间或条件下关闭计算机
    的头像 发表于 11-26 15:33 2635次阅读

    电位器三个引脚怎么接?怎么判断电位器的好坏?

    整个电路的工作效果和稳定性。下面将详细介绍电位器的引脚接法以及判断电位器好坏的方法。 一、电位器的引脚接法: 1. 端电位器:端电位器是最常见的一种电位器,它有三个引脚,两
    的头像 发表于 11-22 16:55 1.7w次阅读

    mos管三个引脚怎么区分

    mos管三个引脚怎么区分  MOS管是一种常见的电子元件,它被广泛应用于各种电子设备中。MOS管通常具有三个引脚,即栅极(Gate)、源极(Source)和漏极(Drain)。这三个
    的头像 发表于 11-22 16:51 6876次阅读