<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你應該搞懂的 C 語言頭文件路徑問題

矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2023-06-14 11:41 ? 次閱讀
聊聊 C 語言項目的系統路徑位置,絕對路徑與相對路徑,正斜杠 `/`與 反斜杠`\\` 使用說明   ......  by 矜辰所致

前言

前段時間在寫 Linux 專欄的過程中,忽然想到一個問題 :C語言的頭文件路徑,因為在GCC環境下面,可以很直觀的了解到程序對頭文件的查找位置,但是對于使用集成開發環境 KEIL 或者 IAR 的朋友們來說,一些系統的庫文件路徑根本就不知道在什么地方。

所以本文我們就來聊一下 C 語言的頭文件路徑相關的問題 ,包括系統路徑位置,絕對路徑與相對路徑,正斜杠 / 與 反斜杠 \\ 使用說明等。

我是矜辰所致,全網同名,盡量用心寫好每一系列文章,不浮夸,不將就,認真對待學知識的我們,矜辰所致,金石為開!

一、C語言中的頭文件引用

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

在這里插入圖片描述

而且大家應該都知道:

  • include 使用雙引號" ",編譯器首先在當前目錄下查找頭文件,如果沒有找到,再到系統目錄下查找。

  • include 使用尖括號< >,編譯器會到系統目錄下查找頭文件;

    .

這里額外提一句,因為 使用雙引號" "如果在當前目錄找不到頭文件,最終還是會去系統路徑下尋找,所以頭文件包含,完全可以都使用雙引號" " ,至于實際中還是有很多使用 < > 和 " " 混搭,那是因為在確定是引用系統路徑的頭文件的時候,使用 < > 相對來說效率高那么一點點,省去了在當前目錄下面尋找的那一點時間。

對于使用雙引號" " 的當前目錄下查找,大家應該都知道,就是與引用頭文件的.c 文件相同的目錄下,比如上面是 main.c 文件引用的,就是首先在與 main.c 相同的目錄中去查找。

那么對于 < > 從系統路徑中搜索,這個系統目錄到底在哪里呢?

二、KEIL 中的頭文件路徑

我們先從我們熟悉的 IDE 入手,用 KEIL 來說明一下。

2.1 IncudePaths 指定的路徑

在我們使用 KEIL 做項目的時候,都需要一個IncudePaths ,就是填寫頭文件路徑,如下圖所示:

KEIL4 上是51單片機的項目:

在這里插入圖片描述

KEIL5 上是 STM32 的項目:

在這里插入圖片描述

為了工程結構框架,我們不可能把文件放在同一個目錄下面,所以需要進行額外的指定頭文件路徑,這里只要用過 KEIL 的朋友應該都能明白。

對于 include 使用雙引號" "的頭文件,首先會在引用頭文件的.c 文件相同的目錄下去查找,如果查找不到,會在上面 IncudePaths 設置中所有設置過的目錄中去查找,這一點我們不多贅述。

絕對路徑和相對路徑

這里我們額外說明一個問題,絕對路徑與相對路徑。

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

使用相對路徑的好處是即便整個工程移動了位置,也無需修改什么設置,因為工程文件的相對位置沒有改變。

簡單復習下相對路徑的表示:

./ : 表示當前路徑

../:表示上一級目錄

絕對路徑就比較簡單了,絕對路徑就是直接從根部(盤符)開始表示的路徑,在 Windows 中,就是 C盤,D盤,這些,在 Linux 中,沒有盤符的說法,根部就是 / ,比如下面兩個都是絕對路徑的表示:

C:\\Keil\\C51

/home/qzh/linux

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

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

在這里插入圖片描述

對于路徑的表示 ( 聲明,這里只是針對文件路徑!路徑! ):

  • Linux 中都使用正斜杠 /

    .

    Linux下好理解,只能用正斜杠 / :/home/qzh/linux

    .

  • 在Windows 中,稍微復雜一點

    .

    在Windows 中常用 反斜杠 \\ ,比如我們隨便看一個系統顯示的路徑都是反斜杠 \\

    在這里插入圖片描述

    .

    實際上,Windows 除了在一些特定的場合必須用反斜杠 \\,在引用路徑的時候斜杠/和反斜杠\\可以互用的。

比如下面兩種方式的引用都是可以的:

#include "..\\led\\led.h" 

#include "../led/led.h"

為了可移植性,引入頭文件時建議使用正斜杠/#include "../led/led.h"

不僅如此,在Windows下引用文件路徑的時候,正反雙斜杠// 、\\\\ 與斜杠 / 、反斜杠\\可以互用的,如下圖所示:

在這里插入圖片描述

雙斜杠

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

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

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

因為在大多編譯器中,\\是一個轉義字符,例如\\n,\\r ,所以如果使用反斜杠 \\,會使得路徑出問題,所以會寫成 \\\\ 。

當然正如我們上面說過的,我們在程序中可以寫成 C:\\\\Keil\\\\C51 ,當然也可以使用 斜杠 / 寫成C:/Keil/C51 。

2.2 include < > 搜索的系統路徑

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

比如我們在本文第一張示意圖上有一個應用#include ,我們明確的告訴編譯器這個需要從系統路徑中去查找,這個 KEIL 所謂的系統路徑在什么地方呢?

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

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

在這里插入圖片描述

當然,我們可以簡單的做個試驗確認一下,我們可以在 KEIL 中先打開 這個頭文件:

在這里插入圖片描述

然后我們打開C:\\Keil\\C51\\INC 目錄下的 MATH.h 文件,進行簡單的修改,然后看一下是否是同一個文件,如下圖:

在這里插入圖片描述

那么對于 KEIL5 中的 STM32 中如果使用 #include < > ,那么這個的查找路徑又是怎樣的呢?

STM32 在 KEIL中使用的編譯器為 ARMCC,這個系統路徑的位置為:“KEIL的安裝目錄”:\\Keil_v5\\ARM\\ARMCC\\include ,比如博主的KEIL安裝在C盤,這個路徑就是C:\\Keil_v5\\ARM\\ARMCC\\include。

這一點我就不去確定了,大家可以自己添加一個庫函數頭文件,然后自己根據上文的方式測試一下便知。

三、Linux 中的頭文件路徑

上面介紹了 Windows 下的 KEIL 環境中的頭文件系統路徑,那么我們來看看 Linux 中的路徑又是在哪里,我們知道在 Linux 中 C 語言的編譯器是 GCC 編譯器,在文章開頭的前言我就寫過了, 使用 GCC 編譯器可以很直觀的查看到 #include < > 尖括號包含的頭文件的查找路徑,下面我們來看一下。

在這里插入圖片描述

寫一個簡單的程序,里面用到了 這個頭文件,我們可以使用編譯選項 -v 來打印出詳細的編譯步驟:

在這里插入圖片描述

如上圖所示,在 Linux 是不是很直觀,沒什么需要特別說明的。

那么我們再換另外一種編譯器,其實還是 GCC ,只不過是 ARMGCC,我們也來看一看:

在這里插入圖片描述

可以看到,同樣的可以很直觀的看到尖括號包含的頭文件的搜索位置,當然,因為編譯器的更換,他們搜索的位置也改變了。

最后簡單總結一下,使用 #include < > 所包含的頭文件,其查找路徑和使用的編譯器有關,編譯器都會自帶常用的庫文件,在 GCC 環境下面,使用 -v 選項就會自動打印出查找位置,使用 IDE 環境根據 IDE 使用的編譯器不同存放在對應的目錄文件下面,一般來說都可以在 IDE 安裝目錄中可以找到。

結語

本文我們針對 C 語言頭文件路徑問題進行了講解,舉例說明了 Windows 下的 IDE 環境中 和 Linux 下GCC 環境中的C語言的 頭文件查找路徑。

文中還對引出的絕對路徑與相對路徑,還有路徑引用時候的 正斜杠 / 與 反斜杠 \\ 與雙斜杠 進行了說明。

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11001

    瀏覽量

    206847
  • WINDOWS
    +關注

    關注

    3

    文章

    3451

    瀏覽量

    87214
  • C語言
    +關注

    關注

    180

    文章

    7538

    瀏覽量

    130270
  • 頭文件
    +關注

    關注

    0

    文章

    23

    瀏覽量

    9805
收藏 人收藏

    評論

    相關推薦

    C語言必備知識頭文件包含

    頭文件在C語言中是非常重要的組成部分。
    的頭像 發表于 12-01 18:20 ?889次閱讀

    如何編寫自己的C語言頭文件

     一些初學C語言的人,不知道頭文件(*.h文件)原來還可以自己寫的。只知道調用系統庫 函數時,要使用#include語句將某些頭文件
    發表于 03-11 22:19

    單片機c語言頭文件如何寫

    本人自己玩單片機時 面對c語言的一些頭文件調用問題感覺很棘手 .h文件 和.c文件 外部函數聲
    發表于 04-14 14:45

    親們,Multisim中C語言頭文件有哪些啊

    Multisim中C語言頭文件有哪些啊,之前編寫文件用了一個,在Multisim中對應的有哪些
    發表于 05-15 17:31

    如何添加頭文件路徑?

    請問如何添加頭文件路徑?自定義的類型和宏出現了各種報錯,諸如:"#" not expected hereexpected a declarationinvalid
    發表于 10-23 07:59

    頭文件找不到的解決方法

    一個完整的工程結構這是一個完整的工程目錄,當然需要注意的幾點1.頭文件找不到:解決方法-------------在編譯設置------c/c++----includepath里面加入
    發表于 08-23 06:08

    一文搞懂頭文件的用法和規則

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

    單片機C語言頭文件

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

    C語言頭文件是做什么的

    c語言程序代碼文件擴展名只能是.c或者.h,換句話說,c語言程序代碼只能在擴展名為.c或者.h的文件中編寫。我們把.h文件稱為
    的頭像 發表于 02-13 15:29 ?9035次閱讀

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

    說明 本文假定讀者已具備基本的C編譯知識。 如非特殊說明,文中源文件指 * .c文件,頭文件指 *.h文件,引用指包含頭文件。 一、
    的頭像 發表于 11-12 17:49 ?2519次閱讀

    C語言頭文件組織與包含原則

    說明本文假定讀者已具備基本的C編譯知識。 如非特殊說明,文中“源文件”指 * .c文件,“頭文件”指 *.h文件,“引用”指包含頭文件。
    的頭像 發表于 11-14 11:31 ?3226次閱讀

    單片機-頭文件

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

    MCU_頭文件編寫

    頭文件中一般放一些重復使用的代碼,如:常量、變量、宏等的定義,函數的聲明。當使用#include語句引用頭頭文件時,相當于將頭文件中的內容復制到#include處。頭文件一般形式:#i
    發表于 12-05 10:36 ?5次下載
    MCU_<b class='flag-5'>頭文件</b>編寫

    C語言頭文件路徑的剖析

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

    C 語言頭文件路徑位置問題

    前言 前段時間在寫 Linux 專欄的過程中,忽然想到一個問題 :C語言頭文件路徑,因為在GCC環境下面,可以很直觀的了解到程序對頭文件的查找位置,但是對于使用集成開發環境 KEIL
    的頭像 發表于 06-22 10:05 ?4323次閱讀
    C <b class='flag-5'>語言</b>的<b class='flag-5'>頭文件</b><b class='flag-5'>路徑</b>位置問題
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>