0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你應(yīng)該搞懂的 C 語(yǔ)言頭文件路徑問(wèn)題

矜辰所致 ? 來(lái)源:矜辰所致 ? 作者:矜辰所致 ? 2023-06-14 11:41 ? 次閱讀
聊聊 C 語(yǔ)言項(xiàng)目的系統(tǒng)路徑位置,絕對(duì)路徑與相對(duì)路徑,正斜杠 `/`與 反斜杠`\\` 使用說(shuō)明   ......  by 矜辰所致

前言

前段時(shí)間在寫(xiě) Linux 專欄的過(guò)程中,忽然想到一個(gè)問(wèn)題 :C語(yǔ)言的頭文件路徑,因?yàn)樵贕CC環(huán)境下面,可以很直觀的了解到程序?qū)︻^文件的查找位置,但是對(duì)于使用集成開(kāi)發(fā)環(huán)境 KEIL 或者 IAR 的朋友們來(lái)說(shuō),一些系統(tǒng)的庫(kù)文件路徑根本就不知道在什么地方。

所以本文我們就來(lái)聊一下 C 語(yǔ)言的頭文件路徑相關(guān)的問(wèn)題 ,包括系統(tǒng)路徑位置,絕對(duì)路徑與相對(duì)路徑,正斜杠 / 與 反斜杠 \\ 使用說(shuō)明等。

我是矜辰所致,全網(wǎng)同名,盡量用心寫(xiě)好每一系列文章,不浮夸,不將就,認(rèn)真對(duì)待學(xué)知識(shí)的我們,矜辰所致,金石為開(kāi)!

一、C語(yǔ)言中的頭文件引用

我們都知道,在我們 C 編程的時(shí)候,我們頭文件的引用使用的是 #include <> 或者 #include "",比如:

在這里插入圖片描述

而且大家應(yīng)該都知道:

  • include 使用雙引號(hào)" ",編譯器首先在當(dāng)前目錄下查找頭文件,如果沒(méi)有找到,再到系統(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)說(shuō)效率高那么一點(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)說(shuō)明一下。

2.1 IncudePaths 指定的路徑

在我們使用 KEIL 做項(xiàng)目的時(shí)候,都需要一個(gè)IncudePaths ,就是填寫(xiě)頭文件路徑,如下圖所示:

KEIL4 上是51單片機(jī)的項(xiàng)目:

在這里插入圖片描述

KEIL5 上是 STM32 的項(xiàng)目:

在這里插入圖片描述

為了工程結(jié)構(gòu)框架,我們不可能把文件放在同一個(gè)目錄下面,所以需要進(jìn)行額外的指定頭文件路徑,這里只要用過(guò) KEIL 的朋友應(yīng)該都能明白。

對(duì)于 include 使用雙引號(hào)" "的頭文件,首先會(huì)在引用頭文件的.c 文件相同的目錄下去查找,如果查找不到,會(huì)在上面 IncudePaths 設(shè)置中所有設(shè)置過(guò)的目錄中去查找,這一點(diǎn)我們不多贅述。

絕對(duì)路徑和相對(duì)路徑

這里我們額外說(shuō)明一個(gè)問(wèn)題,絕對(duì)路徑與相對(duì)路徑。

在上面的示例圖中,我們可以看到,IncudePaths 里面所添加的路徑,都是 ../開(kāi)頭的,這種表示方式就是相對(duì)路徑。

使用相對(duì)路徑的好處是即便整個(gè)工程移動(dòng)了位置,也無(wú)需修改什么設(shè)置,因?yàn)楣こ涛募南鄬?duì)位置沒(méi)有改變。

簡(jiǎn)單復(fù)習(xí)下相對(duì)路徑的表示:

./ : 表示當(dāng)前路徑

../:表示上一級(jí)目錄

絕對(duì)路徑就比較簡(jiǎn)單了,絕對(duì)路徑就是直接從根部(盤(pán)符)開(kāi)始表示的路徑,在 Windows 中,就是 C盤(pán),D盤(pán),這些,在 Linux 中,沒(méi)有盤(pán)符的說(shuō)法,根部就是 / ,比如下面兩個(gè)都是絕對(duì)路徑的表示:

C:\\Keil\\C51

/home/qzh/linux

正斜杠 / 與 反斜杠 \\ 與雙斜杠

正好提到文件路徑,順帶把斜杠的問(wèn)題也說(shuō)一下,在上面示意圖中,我們可以看到,既有正斜杠,又有反斜杠:

在這里插入圖片描述

對(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í)候,正反雙斜杠// 、\\\\ 與斜杠 / 、反斜杠\\可以互用的,如下圖所示:

在這里插入圖片描述

雙斜杠

在寫(xiě)一些腳本或者程序的時(shí)候(上面是引用路徑的情況,這里額外提一下程序中的情況,程序中!程序中!),我們也經(jīng)??吹诫p斜杠,比如:

C:\\\\Keil\\\\C51

這種路徑表示是為什么呢?

因?yàn)樵诖蠖嗑幾g器中,\\是一個(gè)轉(zhuǎn)義字符,例如\\n,\\r ,所以如果使用反斜杠 \\,會(huì)使得路徑出問(wèn)題,所以會(huì)寫(xiě)成 \\\\ 。

當(dāng)然正如我們上面說(shuō)過(guò)的,我們?cè)诔绦蛑锌梢詫?xiě)成 C:\\\\Keil\\\\C51 ,當(dāng)然也可以使用 斜杠 / 寫(xiě)成C:/Keil/C51 。

2.2 include < > 搜索的系統(tǒng)路徑

額外提了那么多,回到我們的正題,來(lái)說(shuō)說(shuō)在 KEIL 中的 #include < > 的查找路徑。

比如我們?cè)诒疚牡谝粡埵疽鈭D上有一個(gè)應(yīng)用#include ,我們明確的告訴編譯器這個(gè)需要從系統(tǒng)路徑中去查找,這個(gè) KEIL 所謂的系統(tǒng)路徑在什么地方呢?

這里我們也沒(méi)什么好分析的,直接告訴大家答案:

第一個(gè)基于51平臺(tái)的,使用的 51 的編譯器, #include < > 的查找路徑為“KEIL的安裝目錄”:\\Keil\\C51\\INC ,比如博主的KEIL安裝在C盤(pán),這個(gè)路徑就是C:\\Keil\\C51\\INC

在這里插入圖片描述

當(dāng)然,我們可以簡(jiǎn)單的做個(gè)試驗(yàn)確認(rèn)一下,我們可以在 KEIL 中先打開(kāi) 這個(gè)頭文件:

在這里插入圖片描述

然后我們打開(kāi)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盤(pán),這個(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 編譯器,在文章開(kāi)頭的前言我就寫(xiě)過(guò)了, 使用 GCC 編譯器可以很直觀的查看到 #include < > 尖括號(hào)包含的頭文件的查找路徑,下面我們來(lái)看一下。

在這里插入圖片描述

寫(xiě)一個(gè)簡(jiǎn)單的程序,里面用到了 這個(gè)頭文件,我們可以使用編譯選項(xiàng) -v 來(lái)打印出詳細(xì)的編譯步驟:

在這里插入圖片描述

如上圖所示,在 Linux 是不是很直觀,沒(méi)什么需要特別說(shuō)明的。

那么我們?cè)贀Q另外一種編譯器,其實(shí)還是 GCC ,只不過(guò)是 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)說(shuō)都可以在 IDE 安裝目錄中可以找到。

結(jié)語(yǔ)

本文我們針對(duì) C 語(yǔ)言頭文件路徑問(wèn)題進(jìn)行了講解,舉例說(shuō)明了 Windows 下的 IDE 環(huán)境中 和 Linux 下GCC 環(huán)境中的C語(yǔ)言的 頭文件查找路徑。

文中還對(duì)引出的絕對(duì)路徑與相對(duì)路徑,還有路徑引用時(shí)候的 正斜杠 / 與 反斜杠 \\ 與雙斜杠 進(jìn)行了說(shuō)明。

希望大家以后在遇到頭文件路徑問(wèn)題的時(shí)候,能夠知道如何去查找問(wèn)題,解決問(wèn)題!

好了,本文就到這里,謝謝大家!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207889
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3503

    瀏覽量

    87876
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134007
  • 頭文件
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    9817
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言必備知識(shí)頭文件包含

    頭文件C語(yǔ)言中是非常重要的組成部分。
    的頭像 發(fā)表于 12-01 18:20 ?1507次閱讀

    FX3工程導(dǎo)入后頭文件找不到是為什么?如何添加頭文件路徑

    在網(wǎng)上參考別人的工程項(xiàng)目,但是載入進(jìn)去之后發(fā)現(xiàn)它的頭文件都找不到,應(yīng)該如何添加頭文件路徑?
    發(fā)表于 05-27 07:53

    如何添加頭文件路徑

    請(qǐng)問(wèn)如何添加頭文件路徑?自定義的類型和宏出現(xiàn)了各種報(bào)錯(cuò),諸如:"#" not expected hereexpected a declarationinvalid
    發(fā)表于 10-23 07:59

    一文搞懂頭文件的用法和規(guī)則

    提到頭文件,大家肯定不陌生。在編寫(xiě)模塊的時(shí)候,一般有一個(gè).c就會(huì)有一個(gè).h,如下圖:在.c中需要使用其他模塊的變量和函數(shù)時(shí),需要先引用頭文件。比如:那么大家真的完全了解
    發(fā)表于 06-20 15:41

    C/C++頭文件大全

    C/C++頭文件一覽,一本很好的工具速查手冊(cè)
    發(fā)表于 11-10 17:45 ?0次下載

    單片機(jī)C語(yǔ)言頭文件

    介紹有關(guān)于單片機(jī)C51編程時(shí)候有關(guān)頭文件的相關(guān)知識(shí),自己整理,歡迎指正!
    發(fā)表于 12-10 15:56 ?12次下載

    如何在C++代碼中使用C頭文件

    12.3 在C target=_blank style=cursor:pointer;color:#D05C38;text-decoration:underline;》C++中使用C
    發(fā)表于 10-19 09:24 ?3次下載

    C語(yǔ)言頭文件是做什么的

    c語(yǔ)言程序代碼文件擴(kuò)展名只能是.c或者.h,換句話說(shuō),c語(yǔ)言程序代碼只能在擴(kuò)展名為.
    的頭像 發(fā)表于 02-13 15:29 ?9248次閱讀

    C語(yǔ)言頭文件組織作用與包含原則詳解

    說(shuō)明 本文假定讀者已具備基本的C編譯知識(shí)。 如非特殊說(shuō)明,文中源文件指 * .c文件,頭文件指 *.h
    的頭像 發(fā)表于 11-12 17:49 ?2726次閱讀

    C語(yǔ)言頭文件組織與包含原則

    說(shuō)明本文假定讀者已具備基本的C編譯知識(shí)。 如非特殊說(shuō)明,文中“源文件”指 * .c文件,“頭文件”指 *.h
    的頭像 發(fā)表于 11-14 11:31 ?3391次閱讀

    C語(yǔ)言中頭文件包含里的那些事

    很多事不深入以為自己懂了,但真正用到項(xiàng)目上,才發(fā)現(xiàn)了問(wèn)題。曾以為自己寫(xiě)C語(yǔ)言已經(jīng)輕車(chē)熟路了,特別是對(duì)軟件文件的工程管理上,因?yàn)樾睦飳?duì)自己的代碼編寫(xiě)風(fēng)格還是有自信的。(畢竟剛畢業(yè)時(shí)老大對(duì)我最初的訓(xùn)練
    的頭像 發(fā)表于 03-25 13:57 ?2311次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中頭文件</b>包含里的那些事

    單片機(jī)-頭文件

    reg52.h頭文件的作用在代碼中引用頭文件,其實(shí)際意義是將頭文件中的所用內(nèi)容都放到引用頭文件的地方下面是reg52.h頭文件的內(nèi)容:/*-
    發(fā)表于 11-23 17:21 ?17次下載
    單片機(jī)-<b class='flag-5'>頭文件</b>

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

    編譯器在編譯過(guò)程中會(huì)按照這些路徑信息到指定的位置去查找頭文件,然后通過(guò)預(yù)處理器作展開(kāi)處理。在查找頭文件的過(guò)程中,編譯器會(huì)按照默認(rèn)的搜索順序到不同的路徑下面去搜索
    的頭像 發(fā)表于 02-17 09:44 ?1641次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>頭文件</b><b class='flag-5'>路徑</b>的剖析

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

    前言 前段時(shí)間在寫(xiě) Linux 專欄的過(guò)程中,忽然想到一個(gè)問(wèn)題 :C語(yǔ)言頭文件路徑,因?yàn)樵贕CC環(huán)境下面,可以很直觀的了解到程序?qū)?b class='flag-5'>頭文件
    的頭像 發(fā)表于 06-22 10:05 ?5754次閱讀
    <b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>頭文件</b><b class='flag-5'>路徑</b>位置問(wèn)題

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

    年輕人,可曾記得,在修習(xí)C語(yǔ)言的時(shí)候,見(jiàn)過(guò)這樣的字句:在創(chuàng)建頭文件的時(shí)候,一定要加入保護(hù)宏。
    的頭像 發(fā)表于 08-29 10:23 ?164次閱讀
    可重復(fù)<b class='flag-5'>頭文件</b>的固定結(jié)構(gòu)