.h头文件那些注意事项

发布时间:2023-03-28  

好的编程习惯,会直接影响代码的质量,在嵌入式C/C++中,头文件的引用方式和方法有多种,同时一些细节也会影响你代码质量和编译效率。




下面就来说说与头文件有关的知识;




引号“”和尖括号<>


#include使用引号“” 还是 尖括号<> 这个是有规定的。




通常来说:系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。


#include



用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找。


#include "xxx.h"



这里可以参看我之前分享的一篇文章:#include使用引号“”和尖括号<>的区别?




引用头文件路径问题


一个项目通常有多个源文件,你要让编译器找到这些存储在不同路径下的源文件,就必须要让编译器知道源代码所在(路径)位置。




引用头文件路径的方式有多种,在代码中添加路径,在IDE工具中添加路径,还有分绝对路径和相对路径。下面就来简单说说:


1.源代码中引用头文件不使用集成开发环境(IDE),通常会在源代码中添加路径信息,比如在源代码文件中引用头文件:


#include "/strongerhuang/robot/project/bsp/bsp_uart.h"#include "../bsp/bsp_uart.h"



但是,你会发现上面那个引用有什么区别吗?




一个是绝对路径:


#include "/strongerhuang/robot/project/bsp/bsp_uart.h"



一个是相对路径:


#include "../bsp/bsp_uart.h"



2.IDE工具中引用头文件我们使用的Keil、IAR这种工具,可以不用像上面那样,在源代码中添加路径头文件,只需要在工程中配置编译路径即可。

比如Keil MDK:通过菜单 Project -> Options for Taget -> C/C++:


Keil MDK默认是相对(工程文件的)路径。


这里推荐扩展阅读(工程选项配置)相关的文章:Keil系列教程05_工程目标选项配置(一)Keil系列教程06_工程目标选项配置(二)


IAR EWARM类似:通过菜单 Project -> Options -> C/C++ Compiler:


IAR默认是绝对路径,通常我们需要修改为相对路径。


这里推荐扩展阅读(工程选项配置)相关的文章:IAR系列教程06_工程节点选项配置(一)IAR系列教程07_工程节点选项配置(二)


头文件相关内容

这里顺便说下关于头文件的几个重要内容。1.防止头文件被重复引用这个问题对于老司机来说,可能不是什么问题,但很多新手却没搞明白是什么意思。


通常,在某xxx.h头文件中,会有类似如下的一部分代码:


    #ifndef _XXX_H#define _XXX_H#endif


    “#”这是一个预处理指令,什么意思呢?

    简单来说就是:如果没有包含XXX.h头文件,就包含;否则不包含(即不重复引用)


    2.全局(全部)头文件有些工程师喜欢把一个工程中所有的.h头文件放在一个全局的头文件(比如 global.h)中,然后,每个.c源文件去引用这个(global.h)头文件。


    这样有利也有弊:利:简单方便,不用担心因为漏掉一个 .h 文件而引起错误、警告;

    弊:只要修改一个.h,工程就需要全局编译,浪费很多时间;


    所以,我个人建议不使用这种全局头文件(global.h)来管理头文件。

    这种做法只是方便了一时,也不利于管理,在几个源文件这种小项目中可能没觉得什么。

    但是,如果项目越来越大,特别几十上百个源代码,每个源文件代码又比较大的情况下,你修改一个 .h 文件,只能慢慢等待编译。

    在项目比较敢的时候,这种做法可能会使你心态奔溃。


    ------------ END ------------


    文章来源于:电子工程世界    原文链接
    本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

    相关文章

      STM32CubeMX简介和安装使用方法;一、STM32CubeMX 简介 1、STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的......
      电动机,交流高速电机,而高速电机又可以被称为电主轴,高速电主轴等等。   交流电机可以按照不同的分类方式划分,包括以下几种:   1. 按照电源类型:单相交流电机、三相交流电机   2. 按照转子类型:异步......
      :西安科技大学, 2018. [3] 周贝贝.基于深度学习的视频分类方法研究[D].西安:西安科技大学, 2020. [4] 罗振庭,郑光勇,朱亚玲.基于低功耗的物联网野外视频监控系统设计[J].信息......
      人员用一个或多个配方(Recipe)来定义他/她自己的层(layer)。配方(Recipe)包含构建工件所需的全部信息。现在,开发人员应该编写尽可能好的代码,以避免以后需要重写。   有很多种方法可以用来避免重写......
      人员用一个或多个配方(Recipe)来定义他/她自己的层(layer)。配方(Recipe)包含构建工件所需的全部信息。现在,开发人员应该编写尽可能好的代码,以避免以后需要重写。 有很多种方法可以用来避免重写代码。一个......
      界面设计的另一个关键是能够使用快速响应的用户输入模式,例如触摸屏和语音技术。   为了创建具有使用仪表板显示屏的 GUI 的实用且适销对路的嵌入式汽车应用程序,您必须能够成功解决所有这些问题。   直到近,现有的面向对象的 Java GUI 框架......
      。截至目前,CodeWhisperer支持的开发语言包括Java、Python、JavaScript、TypeScript、C#、Go、Ruby、Rust、Scala、Kotlin、PHP、C、C......
      目前,CodeWhisperer支持的开发语言包括Java、Python、JavaScript、TypeScript、C#、Go、Ruby、Rust、Scala、Kotlin、PHP、C、C......
      人认为相对java那些纯软件,单片机比较好学。 单片机编程只需要学习C语言,很多人也会把汇编也学了,但是实际产品开发汇编一般用的还是比较少。 反正我从来没用汇编做过项目,所以只需要学习C语言......
      ) self.server.start() 我们再进到server.py文件中,找到ROSLaunchNode类,里面的start函数又调用了父类XmlRpcNode中的start函数。 class......

    我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

    利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

    充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

    我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

    我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

    凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

    我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>