軟體專案中引用標頭檔案的使用方法!

2021-10-21 12:26:18 字數 2813 閱讀 4397

好的程式設計習慣,會直接影響**的質量,在嵌入式c/c++中,標頭檔案的引用方式和方法有多種,同時一些細節也會影響你的**質量和編譯效率。

下面就來說說與標頭檔案有關的知識:

嵌入式專欄

引號「」和尖括號<>

#include使用引號「」 還是 尖括號<> 這個是有規定的。

通常來說:系統自帶的標頭檔案用尖括號括起來,這樣編譯器會在系統檔案目錄下查詢

#include
使用者自定義的檔案用雙引號括起來,編譯器首先會在使用者目錄下查詢。

#include "***.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.防止標頭檔案被重複引用

這個問題對於老司機來說,可能不是什麼問題,但很多新手卻沒搞明白是什麼意思。

通常,在某***.h標頭檔案中,會有類似如下的一部分**:

#ifndef _***_h

#define _***_h

#endif

「#」這是乙個預處理指令,什麼意思呢?

簡單來說就是:如果沒有包含***.h標頭檔案,就包含;否則不包含(即不重複引用)

2.全域性(全部)標頭檔案

有些工程師喜歡把乙個工程中所有的.h標頭檔案放在乙個全域性的標頭檔案(比如 global.h)中,然後,每個.c原始檔去引用這個(global.h)標頭檔案。

這樣有利也有弊:

利:簡單方便,不用擔心因為漏掉乙個 .h 檔案而引起錯誤、警告;

弊:只要修改乙個.h,工程就需要全域性編譯,浪費很多時間;

所以,我個人建議不使用這種全域性標頭檔案(global.h)來管理標頭檔案。

這種做法只是方便了一時,也不利於管理,在幾個原始檔這種小專案中可能沒覺得什麼。

但是,如果專案越來越大,特別幾十上百個源**,每個原始檔**又比較大的情況下,你修改乙個 .h 檔案,只能慢慢等待編譯。

在專案比較敢的時候,這種做法可能會使你心態奔潰。

1.2023年第3期《微控制器與嵌入式系統應用》電子刊新鮮出爐!

2.mcu為什麼內部不整合晶振?

3.mcu開發中,你選」裸奔「還是rtos?

4.mit發布2023年10大突破性技術~

5.google重磅發布flutter 2!一套**橫掃 5 大系統

6.硬體工程師常用的5v轉3.3v的方法

軟體專案中引用標頭檔案的幾種方法及要點

關注 星標公眾 作者 strongerhuang 好的程式設計習慣,會直接影響 的質量,在嵌入式c c 中,標頭檔案的引用方式和方法有多種,同時一些細節也會影響你 質量和編譯效率。下面就來說說與標頭檔案有關的知識 嵌入式專欄 引號 和尖括號 include使用引號 還是 尖括號 這個是有規定的。通常...

vue專案中axios的全域性使用方法

我是跟著上面這句話這個思路去往下想的 vue文件中開發外掛程式的文件 如果想寫乙個vue外掛程式,該外掛程式需要有個公開方法install,這個方法的第乙個引數是 vue 構造器,第二個引數是乙個可選的選項物件 var myplugin 物件才能點方法 myplugin.install functi...

Fastjson的使用方法,專案中遇到的問題

com.alibaba fastjson x.x.x jsonfield name age private int age 轉換完後 如果沒有迴圈的父節點,例如system上面還是system,直接乙個map快取判斷是否存在就可以 對於有迴圈父節點的,首先遞迴呼叫從該節點找到根節點 isroot 1...