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

    文章

    4776

    浏览量

    68509
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32849

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    可调电阻三个脚各是什么

    可调电阻器,也称为电位器或可变电阻器,是一种可调节电阻值的电子元件。它通常由三个脚(引脚)组成,分别是固定脚、滑动脚和可调脚。以下是对这三个脚的介绍: 固定脚(Fixed Terminal): 固定
    的头像 发表于 07-24 11:06 1894次阅读

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

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

    如何判断极管的三个极性

    极管是电子电路中的基本元件之一,其性能的好坏直接影响到整个电路的性能。而判断极管的三个极性(基极b、发射极e、集电极c)是电路分析和设计中不可或缺的一步。下面将详细介绍判断极管
    的头像 发表于 05-21 15:26 6301次阅读

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

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

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

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

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

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

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

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

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

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

    人机交互的三个阶段 人机交互的常用方式

    机交互经历的三个阶段:命令行界面交互阶段、图形用户界面交互阶段、自然和谐的人机交互阶段。
    的头像 发表于 03-13 17:25 3016次阅读

    三个电位怎么判断NPN还是PNP

    晶体管是一种常见的电子元件,用于放大和开关电流。根据晶体管的构造和极性,可以将其分为NPN型和PNP型晶体管。判断晶体管的极性对正确使用和连接电路至关重要。本文将详细介绍如何通过三个电位来判断晶体管
    的头像 发表于 02-27 15:02 2854次阅读

    电位器的三个触点都起什么作用?是不是三个触头电阻各不一样?

    电位器的三个触点都是起什么作用的?是不是三个触头电阻各不一样?怎么测每个触头的电阻? 电位器是电子元器件中常见的一种,它有三个触点,分别是两
    的头像 发表于 02-05 10:00 1298次阅读

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

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

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

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