软件项目中引用头文件的几种方法及要点
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
好的编程习惯,会直接影响代码的质量,在嵌入式C/C++中,头文件的引用方式和方法有多种,同时一些细节也会影响你代码质量和编译效率。
下面就来说说与头文件有关的知识;
嵌入式专栏
1
引号“”和尖括号<>
#include使用引号“” 还是 尖括号<> 这个是有规定的。
通常来说:系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。
#include <xxx.h>
用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找。
#include "xxx.h"
这里可以参看我之前分享的一篇文章:#include使用引号“”和尖括号<>的区别?
嵌入式专栏
2
引用头文件路径问题
一个项目通常有多个源文件,你要让编译器找到这些存储在不同路径下的源文件,就必须要让编译器知道源代码所在(路径)位置。
引用头文件路径的方式有多种,在代码中添加路径,在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_工程节点选项配置(二)
嵌入式专栏
3
头文件相关内容
这里顺便说下关于头文件的几个重要内容。
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 ------------
后台回复『嵌入式C语言』『嵌入式软件基础知识』相关文章。
欢迎关注我的公众号,回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
欢迎关注我的视频号:
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
软件项目中引用头文件的几种方法及要点相关推荐
- python中的main函数可以被其他文件调用么_Python中在脚本中引用其他文件函数的实现方法...
在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和 ...
- Linux系统中运行.sh文件的几种方法
在Linux系统中执行.sh文件的几种方法: 1. cd到.sh文件所在的目录,然后执行./xxx.sh [前提:该./sh文件要有可执行的权限,chmod u+x xxx.sh] 2. 在任何 ...
- matlab中读文件的行数_Matlab中读取txt文件的几种方法
Matlab中读取txt文件的几种方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为"17.901 -1.1 ...
- matlab中如何读写txt,Matlab中读取txt文件的几种方法
Matlab中读取txt文件的几种方法 matlab读取文本文件的几种函数: 1.load--适合读取纯数据文本: 2.importdata--只读取数据,自动省略数据格式前后的字符,超大文件不适合: ...
- python中字符串怎么引用_Python:字符串中引用外部变量的3种方法
方法一: username=input('username:') age=input('age:') job=input('job:') salary=input('salary') info1='' ...
- spark 读取ftp_在 Shell 中下载 ftp 文件的几种方法
FTP 是 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于 Internet 上的控制文件的双向传输.同时,它也是一个应用程 ...
- 看板管理方法在软件项目中的意义,以及与Scrum方法的区别
一.什么是看板 看板是一种适用于实施敏捷和 DevOps 软件开发的系统框架,核心在于工作的全方位可视化以及基于工作的实时沟通.通过看板中各工作项的直观展示,可以让团队成员清晰了解各项工作的状态及进展 ...
- MyEclipse将Java项目打包成jar文件的三种方法
2019独角兽企业重金招聘Python工程师标准>>> 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MANIFEST.MF", 由于 ...
- myeclipse打包java文件_MyEclipse将Java项目打包成jar文件的三种方法
方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MANIFEST.MF", 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFE ...
最新文章
- R语言图形用户界面数据挖掘包Rattle:加载UCI糖尿病数据集、并启动Rattle图形用户界面、数据集变量重命名,为数据集结果变量添加标签、数据划分(训练集、测试集、验证集)、随机数设置
- 切换node版本 nvm 的基本使用 -- 以及安装公司特有的镜像源
- 损失函数,梯度下降与牛顿法
- mybatis generator Unknown system variable 'query_cache_size' 的解决方法
- linux mysql 磁盘空间_磁盘空间满了之后MySQL会怎样
- C语言内存泄露很严重,如何应对?
- 【华为云技术分享】深度详解GaussDB bufferpool缓存策略
- 鸿蒙应用开发--事件
- zabbix系列zabbix3.4监控mysql5.7
- Mac新手比较容易犯的一些错误
- python门店会员管理系统_python---CRM用户关系管理
- echart制作环形图
- 《基于多支持向量机综合的电力系统暂态稳定评估》总结
- zemax中非序列添加相位面_zemax非序列照明技巧汇编
- QQ突遭大规模盗号!自动给好友群发不雅照,官方回应来了!
- Codeforces Round #727 (Div. 2)
- 【今日分享】官方实例用python调用OpenAI tahcTPG的APIkey生成智能问答
- AD那些事 切割板子形状,线的弧度转换
- csvn-httpd启动报AH00094错解决办法
- WebView-WebView状态和加载方式
热门文章
- Mac如何录屏 同时录内置声音
- 怎么才能做好团队管理|方法论加模型案例(附常用管理模型、人员架构图)
- Type interface com.aiit.mapper.BrandMapper is not known to the MapperRegistry.解决办法
- 使用证件照研究院接口实现制作证件照
- 【全开源+免费更新】doodoo.js快速入门教程 1
- 文墨绘学怨气里长大的孩子
- 微信小程序腾讯服务器地址要购买吗,微信小程序JavaScript SDK
- 智能手机屏幕失灵了,怎么办?
- Zbrush 4R7 P3中给类模型怎么快速隐藏
- 二十九、K8s最小服务漏洞3-gVisor沙箱