聊聊 C 語(yǔ)言項(xiàng)目的系統(tǒng)路徑位置,絕對(duì)路徑與相對(duì)路徑,正斜杠 `/`與 反斜杠`\\` 使用說明 ...... by 矜辰所致
前言
前段時(shí)間在寫 Linux 專欄的過程中,忽然想到一個(gè)問題 :C語(yǔ)言的頭文件路徑,因?yàn)樵贕CC環(huán)境下面,可以很直觀的了解到程序?qū)︻^文件的查找位置,但是對(duì)于使用集成開發(fā)環(huán)境 KEIL 或者 IAR 的朋友們來(lái)說,一些系統(tǒng)的庫(kù)文件路徑根本就不知道在什么地方。
所以本文我們就來(lái)聊一下 C 語(yǔ)言的頭文件路徑相關(guān)的問題 ,包括系統(tǒng)路徑位置,絕對(duì)路徑與相對(duì)路徑,正斜杠 / 與 反斜杠 \\ 使用說明等。
我是矜辰所致,全網(wǎng)同名,盡量用心寫好每一系列文章,不浮夸,不將就,認(rèn)真對(duì)待學(xué)知識(shí)的我們,矜辰所致,金石為開!
一、C語(yǔ)言中的頭文件引用
我們都知道,在我們 C 編程的時(shí)候,我們頭文件的引用使用的是 #include <>
或者 #include ""
,比如:
而且大家應(yīng)該都知道:
-
include 使用雙引號(hào)" ",編譯器首先在當(dāng)前目錄下查找頭文件,如果沒有找到,再到系統(tǒng)目錄下查找。
-
include 使用尖括號(hào)< >,編譯器會(huì)到系統(tǒng)目錄下查找頭文件;
.
這里額外提一句,因?yàn)?使用雙引號(hào)" "如果在當(dāng)前目錄找不到頭文件,最終還是會(huì)去系統(tǒng)路徑下尋找,所以頭文件包含,完全可以都使用雙引號(hào)" " ,至于實(shí)際中還是有很多使用 < > 和 " " 混搭,那是因?yàn)樵诖_定是引用系統(tǒng)路徑的頭文件的時(shí)候,使用 < > 相對(duì)來(lái)說效率高那么一點(diǎn)點(diǎn),省去了在當(dāng)前目錄下面尋找的那一點(diǎn)時(shí)間。
對(duì)于使用雙引號(hào)" " 的當(dāng)前目錄下查找,大家應(yīng)該都知道,就是與引用頭文件的.c
文件相同的目錄下,比如上面是 main.c
文件引用的,就是首先在與 main.c
相同的目錄中去查找。
那么對(duì)于 < > 從系統(tǒng)路徑中搜索,這個(gè)系統(tǒng)目錄到底在哪里呢?
二、KEIL 中的頭文件路徑
我們先從我們熟悉的 IDE 入手,用 KEIL 來(lái)說明一下。
2.1 IncudePaths 指定的路徑
在我們使用 KEIL 做項(xiàng)目的時(shí)候,都需要一個(gè)IncudePaths
,就是填寫頭文件路徑,如下圖所示:
KEIL4 上是51單片機(jī)的項(xiàng)目:
KEIL5 上是 STM32 的項(xiàng)目:
為了工程結(jié)構(gòu)框架,我們不可能把文件放在同一個(gè)目錄下面,所以需要進(jìn)行額外的指定頭文件路徑,這里只要用過 KEIL 的朋友應(yīng)該都能明白。
對(duì)于 include 使用雙引號(hào)" "的頭文件,首先會(huì)在引用頭文件的.c
文件相同的目錄下去查找,如果查找不到,會(huì)在上面 IncudePaths
設(shè)置中所有設(shè)置過的目錄中去查找,這一點(diǎn)我們不多贅述。
絕對(duì)路徑和相對(duì)路徑
這里我們額外說明一個(gè)問題,絕對(duì)路徑與相對(duì)路徑。
在上面的示例圖中,我們可以看到,IncudePaths
里面所添加的路徑,都是 ../
開頭的,這種表示方式就是相對(duì)路徑。
使用相對(duì)路徑的好處是即便整個(gè)工程移動(dòng)了位置,也無(wú)需修改什么設(shè)置,因?yàn)楣こ涛募南鄬?duì)位置沒有改變。
簡(jiǎn)單復(fù)習(xí)下相對(duì)路徑的表示:
./
: 表示當(dāng)前路徑
../
:表示上一級(jí)目錄
絕對(duì)路徑就比較簡(jiǎn)單了,絕對(duì)路徑就是直接從根部(盤符)開始表示的路徑,在 Windows 中,就是 C盤,D盤,這些,在 Linux 中,沒有盤符的說法,根部就是 /
,比如下面兩個(gè)都是絕對(duì)路徑的表示:
C:\\Keil\\C51
/home/qzh/linux
正斜杠 / 與 反斜杠 \\ 與雙斜杠
正好提到文件路徑,順帶把斜杠的問題也說一下,在上面示意圖中,我們可以看到,既有正斜杠,又有反斜杠:
對(duì)于路徑的表示 ( 聲明,這里只是針對(duì)文件路徑!路徑! ):
-
Linux 中都使用正斜杠
/
.
Linux下好理解,只能用正斜杠
/
:/home/qzh/linux
.
-
在Windows 中,稍微復(fù)雜一點(diǎn)
.
在Windows 中常用 反斜杠
\\
,比如我們隨便看一個(gè)系統(tǒng)顯示的路徑都是反斜杠\\
:.
實(shí)際上,Windows 除了在一些特定的場(chǎng)合必須用反斜杠
\\
,在引用路徑的時(shí)候斜杠/
和反斜杠\\
可以互用的。
比如下面兩種方式的引用都是可以的:
#include "..\\led\\led.h"
#include "../led/led.h"
為了可移植性,引入頭文件時(shí)建議使用正斜杠/
:#include "../led/led.h"
不僅如此,在Windows下引用文件路徑的時(shí)候,正反雙斜杠//
、\\\\
與斜杠 /
、反斜杠\\
可以互用的,如下圖所示:
雙斜杠 :
在寫一些腳本或者程序的時(shí)候(上面是引用路徑的情況,這里額外提一下程序中的情況,程序中!程序中?。?,我們也經(jīng)??吹诫p斜杠,比如:
C:\\\\Keil\\\\C51
這種路徑表示是為什么呢?
因?yàn)樵诖蠖嗑幾g器中,\\
是一個(gè)轉(zhuǎn)義字符,例如\\n,\\r
,所以如果使用反斜杠 \\
,會(huì)使得路徑出問題,所以會(huì)寫成 \\\\
。
當(dāng)然正如我們上面說過的,我們?cè)诔绦蛑锌梢詫懗?C:\\\\Keil\\\\C51
,當(dāng)然也可以使用 斜杠 /
寫成C:/Keil/C51
。
2.2 include < > 搜索的系統(tǒng)路徑
額外提了那么多,回到我們的正題,來(lái)說說在 KEIL 中的 #include < >
的查找路徑。
比如我們?cè)诒疚牡谝粡埵疽鈭D上有一個(gè)應(yīng)用#include
,我們明確的告訴編譯器這個(gè)需要從系統(tǒng)路徑中去查找,這個(gè) KEIL 所謂的系統(tǒng)路徑在什么地方呢?
這里我們也沒什么好分析的,直接告訴大家答案:
第一個(gè)基于51平臺(tái)的,使用的 51 的編譯器, #include < >
的查找路徑為“KEIL的安裝目錄”:\\Keil\\C51\\INC
,比如博主的KEIL安裝在C盤,這個(gè)路徑就是C:\\Keil\\C51\\INC
:
當(dāng)然,我們可以簡(jiǎn)單的做個(gè)試驗(yàn)確認(rèn)一下,我們可以在 KEIL 中先打開 這個(gè)頭文件:
然后我們打開C:\\Keil\\C51\\INC
目錄下的 MATH.h 文件,進(jìn)行簡(jiǎn)單的修改,然后看一下是否是同一個(gè)文件,如下圖:
那么對(duì)于 KEIL5 中的 STM32 中如果使用 #include < >
,那么這個(gè)的查找路徑又是怎樣的呢?
STM32 在 KEIL中使用的編譯器為 ARMCC,這個(gè)系統(tǒng)路徑的位置為:“KEIL的安裝目錄”:\\Keil_v5\\ARM\\ARMCC\\include
,比如博主的KEIL安裝在C盤,這個(gè)路徑就是C:\\Keil_v5\\ARM\\ARMCC\\include
。
這一點(diǎn)我就不去確定了,大家可以自己添加一個(gè)庫(kù)函數(shù)頭文件,然后自己根據(jù)上文的方式測(cè)試一下便知。
三、Linux 中的頭文件路徑
上面介紹了 Windows 下的 KEIL 環(huán)境中的頭文件系統(tǒng)路徑,那么我們來(lái)看看 Linux 中的路徑又是在哪里,我們知道在 Linux 中 C 語(yǔ)言的編譯器是 GCC 編譯器,在文章開頭的前言我就寫過了, 使用 GCC 編譯器可以很直觀的查看到 #include < >
尖括號(hào)包含的頭文件的查找路徑,下面我們來(lái)看一下。
寫一個(gè)簡(jiǎn)單的程序,里面用到了
這個(gè)頭文件,我們可以使用編譯選項(xiàng) -v
來(lái)打印出詳細(xì)的編譯步驟:
如上圖所示,在 Linux 是不是很直觀,沒什么需要特別說明的。
那么我們?cè)贀Q另外一種編譯器,其實(shí)還是 GCC ,只不過是 ARMGCC,我們也來(lái)看一看:
可以看到,同樣的可以很直觀的看到尖括號(hào)包含的頭文件的搜索位置,當(dāng)然,因?yàn)榫幾g器的更換,他們搜索的位置也改變了。
最后簡(jiǎn)單總結(jié)一下,使用 #include < > 所包含的頭文件,其查找路徑和使用的編譯器有關(guān),編譯器都會(huì)自帶常用的庫(kù)文件,在 GCC 環(huán)境下面,使用 -v 選項(xiàng)就會(huì)自動(dòng)打印出查找位置,使用 IDE 環(huán)境根據(jù) IDE 使用的編譯器不同存放在對(duì)應(yīng)的目錄文件下面,一般來(lái)說都可以在 IDE 安裝目錄中可以找到。
結(jié)語(yǔ)
本文我們針對(duì) C 語(yǔ)言頭文件路徑問題進(jìn)行了講解,舉例說明了 Windows 下的 IDE 環(huán)境中 和 Linux 下GCC 環(huán)境中的C語(yǔ)言的 頭文件查找路徑。
文中還對(duì)引出的絕對(duì)路徑與相對(duì)路徑,還有路徑引用時(shí)候的 正斜杠 /
與 反斜杠 \\
與雙斜杠 進(jìn)行了說明。
希望大家以后在遇到頭文件路徑問題的時(shí)候,能夠知道如何去查找問題,解決問題!
好了,本文就到這里,謝謝大家!
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11420瀏覽量
212319 -
WINDOWS
+關(guān)注
關(guān)注
4文章
3598瀏覽量
90692 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139695 -
頭文件
+關(guān)注
關(guān)注
0文章
26瀏覽量
10008
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FX3工程導(dǎo)入后頭文件找不到是為什么?如何添加頭文件路徑?
如何添加頭文件路徑?
一文搞懂頭文件的用法和規(guī)則
單片機(jī)C語(yǔ)言頭文件
如何在C++代碼中使用C頭文件
C語(yǔ)言頭文件是做什么的
C語(yǔ)言頭文件組織作用與包含原則詳解
C語(yǔ)言的頭文件組織與包含原則
單片機(jī)-頭文件

C語(yǔ)言頭文件路徑的剖析

C 語(yǔ)言的頭文件路徑位置問題

可重復(fù)頭文件的固定結(jié)構(gòu)

評(píng)論