在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

科技綠洲 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2023-06-22 10:05 ? 次閱讀

前言

前段時間在寫 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下引用文件路徑的時候,正反雙斜杠//\\\\ 與斜杠 / 、反斜杠\\可以互用的,如下圖所示:

圖片

雙斜杠

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

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

    文章

    11430

    瀏覽量

    212443
  • 編譯器
    +關注

    關注

    1

    文章

    1653

    瀏覽量

    49764
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

    前段時間在寫 Linux 專欄的過程中,忽然想到一個問題 :C語言頭文件路徑,因為在GCC環境下面,可以很直觀的了解到程序對頭文件的查找
    的頭像 發表于 06-14 11:41 ?5834次閱讀
    你應該搞懂的 <b class='flag-5'>C</b> <b class='flag-5'>語言</b><b class='flag-5'>頭文件</b><b class='flag-5'>路徑</b>問題

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

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

    C/C++頭文件大全

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

    單片機C語言頭文件

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

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

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

    C語言中程序員編寫的頭文件和編譯器自帶的頭文件

    #include 指令會指示 C 預處理器瀏覽指定的文件作為輸入。預處理器的輸出包含了已經生成的輸出,被引用文件生成的輸出以及 #include 指令之后的文本輸出。例如,如果您有一個
    的頭像 發表于 11-12 14:55 ?8034次閱讀

    單片機C語言編程的頭文件reg51.h和reg52.h的詳細資料解析

      我們在用c語言編程是往往第一行就是reg51.h或者其他的自定義頭文件,我們怎么樣來理解呢?
    發表于 07-24 17:37 ?2次下載
    單片機<b class='flag-5'>C</b><b class='flag-5'>語言</b>編程的<b class='flag-5'>頭文件</b>reg51.h和reg52.h的詳細資料解析

    C語言頭文件是做什么的

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

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

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

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

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

    C語言中頭文件包含里的那些事

    很多事不深入以為自己懂了,但真正用到項目上,才發現了問題。曾以為自己寫C語言已經輕車熟路了,特別是對軟件文件的工程管理上,因為心里對自己的代碼編寫風格還是有自信的。(畢竟剛畢業時老大對我最初的訓練
    的頭像 發表于 03-25 13:57 ?2543次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中頭文件</b>包含里的那些事

    keil添加了頭文件仍然報找不到頭文件的原因

    ,則需要重新將文件夾包含到工程中。4)點擊魔術棒中的C/C++,將包含該頭文件的最內層文件夾包含進去,一定要包含最內層
    發表于 11-21 14:21 ?13次下載
    keil添加了<b class='flag-5'>頭文件</b>仍然報找不到<b class='flag-5'>頭文件</b>的原因

    單片機-頭文件

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

    C語言頭文件路徑的剖析

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

    C語言中的頭文件能不能重復包含

    C語言中的頭文件能不能重復包含? 比如代碼寫成這樣,stdio.h 連續包含了兩次。 #include #include int main(){ printf("helloworld
    的頭像 發表于 11-26 17:19 ?442次閱讀
    主站蜘蛛池模板: 国产三级日产三级日本三级 | 成人夜色视频网站在线观看 | 婷婷激情亚洲 | 91在线激情在线观看 | 亚洲国产精品综合久久2007 | 久久九色 | 欧美性xxxx巨大黑人猛 | 久久美女精品国产精品亚洲 | 国产精品黄网站免费进入 | 日韩色影视 | 五月天婷婷色图 | 中国又粗又大又爽的毛片 | 日韩草逼 | 天天插天天干 | 天天插夜夜| 最新国产在线播放 | 色视频在线网站 | 欧美日韩一卡2卡三卡4卡新区 | 日韩电影天堂网 | 手机看日韩毛片福利盒子 | a级毛片免费观看网站 | 在线看片成人 | 欧美不卡1卡2卡三卡老狼 | 国产日韩欧美一区二区 | 亚洲精品美女久久久 | 成人涩涩网站 | 日本不卡视频一区二区三区 | 久久国产精品亚洲综合 | 欧美日韩国产一区 | 天天草视频 | 一级片在线免费看 | 免费人成年激情视频在线观看 | 好看的一级毛片 | 色吧在线观看 | 色老头久久久久久久久久 | 日韩乱轮| 毛片午夜| 四虎最新永久免费网址 | 综合六月 | 在线www| 伊人网视频在线 |