软件项目中引用头文件的几种方法及要点

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

[[385666]]

 本文转载自微信公众号「strongerHuang」,作者strongerHuang。转载本文请联系strongerHuang公众号。

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

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

1.引号“”和尖括号<>

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

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

 

  1. #include 

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

  1. #include "xxx.h" 

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

2.引用头文件路径问题

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

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

1).源代码中引用头文件

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

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

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

一个是绝对路径:

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

一个是相对路径:

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

2).IDE工具中引用头文件

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

比如Keil MDK:

通过菜单 Project -> Options for Taget -> C/C++:

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

IAR EWARM类似:

通过菜单 Project -> Options -> C/C++ Compiler:

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

3.头文件相关内容

这里顺便说下关于头文件的几个重要内容。

1).防止头文件被重复引用

这个问题对于老司机来说,可能不是什么问题,但很多新手却没搞明白是什么意思。

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

  1. #ifndef _XXX_H 
  2. #define _XXX_H 
  3.  
  4. #endif 

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

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

2).全局(全部)头文件

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

这样有利也有弊:

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

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

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

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

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

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

 

责任编辑:武晓燕 来源: strongerHuang
相关推荐

2021-03-08 09:32:04

Python文件命令

2009-09-01 18:35:53

C#判断文件存在

2011-04-06 15:15:19

2014-08-22 15:50:52

WindowsLinux

2010-06-03 08:55:43

LINQ

2013-08-21 11:31:21

iPhone图片方法

2018-09-29 11:02:52

WindowsLinux互访

2020-06-28 10:07:31

加速软件项目IT领导软件开发

2009-09-09 11:24:46

PHP实现MVC

2020-01-10 16:23:44

Springboot停止服务Java

2011-06-16 10:48:33

session

2021-02-26 13:20:48

Shell空行Linux

2009-08-31 09:19:31

c#隐藏窗口

2020-08-24 08:05:47

JavaScriptJavaScript 页面

2010-05-17 15:17:06

MySQL常用操作

2009-09-18 12:29:55

2009-07-21 09:52:06

小型软件项目

2015-10-12 11:06:36

Web前端0.5像素

2022-02-17 09:12:55

MySQL数据库设置变量

2012-12-05 13:54:54

点赞
收藏

51CTO技术栈公众号