在一個(gè)軟件項(xiàng)目中,如果需要在一個(gè)文件中包含另一個(gè)頭文件時(shí),一般有兩種包含方式:
#include
#include “module.h”
如果你引用的頭文件是標(biāo)準(zhǔn)庫(kù)的頭文件或官方路徑下的頭文件,一般使用尖括號(hào) <> 包含;如果你使用的頭文件是自定義的或項(xiàng)目中的頭文件,一般使用雙引號(hào) "" 包含。頭文件路徑一般分為絕對(duì)路徑和相對(duì)路徑:絕對(duì)路徑以根目錄 / 或者Windows下的每個(gè)盤(pán)符為路徑起點(diǎn);相對(duì)路徑則是以程序文件當(dāng)前的目錄為起點(diǎn)。
#include ”/home/wit/code/xx.h” //Linux下的絕對(duì)路徑
#include “F:/litao/code/xx.h" //Windows下的絕對(duì)路徑
#include ”../lcd/lcd.h” //相對(duì)路徑,..表示當(dāng)前目錄的上一層目錄
#include ”./lcd.h” //相對(duì)路徑,.表示當(dāng)前目錄
#include ”lcd.h” //相對(duì)路徑,當(dāng)前文件所在的目錄
編譯器在編譯過(guò)程中會(huì)按照這些路徑信息到指定的位置去查找頭文件,然后通過(guò)預(yù)處理器作展開(kāi)處理。在查找頭文件的過(guò)程中,編譯器會(huì)按照默認(rèn)的搜索順序到不同的路徑下面去搜索,以 #include ? 通過(guò)GCC參數(shù) gcc-I 指定的目錄(注:大寫(xiě)的 i) ? 通過(guò)環(huán)境變量 CINCLUDEPATH 指定的目錄 ? GCC 的內(nèi)定目錄 ? 搜索規(guī)則:當(dāng)不同目錄下存在相同的頭文件時(shí),先搜到那個(gè)使用哪個(gè),搜索停止 當(dāng)我們使用雙引號(hào) “” 來(lái)包含頭文件路徑時(shí),編譯器會(huì)首先到項(xiàng)目當(dāng)前目錄去搜索需要的頭文件,在當(dāng)前項(xiàng)目目錄下面搜不到,再到其他指定的路徑下面去搜索: ? 項(xiàng)目當(dāng)前目錄 ? 通過(guò) GCC 參數(shù) gcc-I 指定的目錄 ? 通過(guò)環(huán)境變量 CINCLUDEPATH 指定的目錄 ? GCC 的內(nèi)定目錄 ? 搜索規(guī)則:當(dāng)不同目錄下存在相同的頭文件時(shí),先搜到那個(gè)使用哪個(gè) 在編譯程序時(shí),如果我們的頭文件沒(méi)有放到官方路徑下面,我們可以通過(guò) gcc -I 來(lái)指定頭文件路徑,編譯器在編譯程序時(shí),就會(huì)到用戶指定的路徑目錄下面去搜索該頭文件。如果你不想通過(guò)這種方式,也可以通過(guò)設(shè)置環(huán)境變量來(lái)添加頭文件的搜索路徑。在 Linux 環(huán)境下我們經(jīng)常使用的環(huán)境變量有: ? PATH: 可執(zhí)行程序的搜索路徑 ? C_INCLUDE_PATH: C語(yǔ)言頭文件搜索路徑 ? CPLUS_INCLUDE_PATH: C++頭文件搜索路徑 ? LIBRARY_PATH: 庫(kù)搜索路徑 我們可以在一個(gè)環(huán)境變量?jī)?nèi)設(shè)置多個(gè)頭文件搜索路徑,各個(gè)路徑之間使用冒號(hào):隔開(kāi)。如果你想每次系統(tǒng)開(kāi)機(jī),這個(gè)環(huán)境變量設(shè)置的路徑信息都生效,可以將下面的 export 命令添加到系統(tǒng)的啟動(dòng)腳本::~/.bashrc文件中。 除此之外,我們也可以將頭文件添加到 GCC 內(nèi)定的官方目錄下面。編譯器在上面指定的各種路徑下面找不到對(duì)應(yīng)的頭文件時(shí),最后會(huì)到 GCC 的內(nèi)定目錄下面去尋找。這些目錄是 GCC 在安裝時(shí),通過(guò) --prefex 參數(shù)指定安裝路徑時(shí)指定的,常見(jiàn)的內(nèi)定目錄有: 接下來(lái)我們做一個(gè)實(shí)驗(yàn),看看實(shí)際情況跟上面說(shuō)得是否一致:我們創(chuàng)建多個(gè)頭文件module.h,分別將其放置到不同的目錄下,在main()函數(shù)中分別#include這個(gè)頭文件,觀察程序的運(yùn)行結(jié)果。 main.c源文件的代碼如下: 在module.h中分別定義一個(gè)宏:NUM,然后將這個(gè)頭文件拷貝到不同的目錄下: 實(shí)驗(yàn)過(guò)程: 這一輪實(shí)驗(yàn)做下來(lái),相信大家已經(jīng)對(duì)頭文件的搜索路徑、搜索順序就有了一個(gè)清晰的認(rèn)識(shí)了。本文摘自《嵌入式C語(yǔ)言自我修養(yǎng)》9.4.6節(jié):export C_INCLUDE_PATH=$C_INCLUDE_PATH:/path1:/path2
/usr/include
/usr/local/include
/usr/include/i386-linux-gnu
/usr/lib/gcc/i686-linux-gnu/5/include
/usr/lib/gcc/i686-linux-gnu/5/include-fixed
/usr/lib/gcc-cross/arm-linux-gnueabi/5/include
# mkdir /home/test
# cd test
# touch main.c module.h
// main.c
#include
-
處理器
+關(guān)注
關(guān)注
68文章
19432瀏覽量
231254 -
文件
+關(guān)注
關(guān)注
1文章
571瀏覽量
24826 -
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49305
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
你應(yīng)該搞懂的 C 語(yǔ)言頭文件路徑問(wèn)題
![你應(yīng)該搞懂的 <b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b><b class='flag-5'>頭文件</b><b class='flag-5'>路徑</b>問(wèn)題](https://file1.elecfans.com/web2/M00/89/A5/wKgZomSJNemAAwgaAABFYKpsUd4552.png)
單片機(jī)C語(yǔ)言頭文件
如何在C++代碼中使用C頭文件
C語(yǔ)言頭文件是做什么的
C語(yǔ)言頭文件組織作用與包含原則詳解
C語(yǔ)言的頭文件組織與包含原則
單片機(jī)-頭文件
![單片機(jī)-<b class='flag-5'>頭文件</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
C 語(yǔ)言的頭文件路徑位置問(wèn)題
![<b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>頭文件</b><b class='flag-5'>路徑</b>位置問(wèn)題](https://file1.elecfans.com/web2/M00/8A/07/wKgZomSOuqmAXeLdAABJQr-8B8k519.jpg)
評(píng)論