溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言中include能包含什么文件

發(fā)布時(shí)間:2021-11-22 14:55:10 來(lái)源:億速云 閱讀:1054 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“C語(yǔ)言中include能包含什么文件”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C語(yǔ)言中include能包含什么文件”吧!

文/Edward  

之前我們已經(jīng)講到過(guò),#include預(yù)處理指令使另外一個(gè)文件的內(nèi)容在預(yù)處理的時(shí)候,先會(huì)被復(fù)制到當(dāng)前的.c文件中來(lái),產(chǎn)生一個(gè)中間文件,一般情況下,這個(gè)中間文件是存儲(chǔ)在編譯器內(nèi)存里面的,它不會(huì)被輸出,但是我們可以使用gcc命令來(lái)將這個(gè)文件存儲(chǔ)下來(lái),即使用” gcc -E ./helloworld.c > a.out”命令,即可將預(yù)處理產(chǎn)生的內(nèi)容保留出來(lái)。如圖1所示。

 C語(yǔ)言中include能包含什么文件
圖1 預(yù)處理輸出文件

我們?cè)趫D1中,僅僅簡(jiǎn)單地包含了一個(gè)我們自己寫(xiě)的一個(gè)頭文件,這個(gè)頭文件里面有一個(gè)#define定義的標(biāo)號(hào)MAX,也有一個(gè)變量a,當(dāng)我們包含了這個(gè)頭文件并且進(jìn)行編譯的時(shí)候,編譯器便會(huì)將頭文件里面的內(nèi)容在編譯流程的預(yù)處理階段把.c源文件中的相關(guān)標(biāo)號(hào)定義全部替換掉,如果.h頭文件里面包含了變量的定義,便會(huì)將變量的定義原封不動(dòng)地復(fù)制到.c源文件中。以上內(nèi)容就是文件包含的全部?jī)?nèi)容。
然而#include預(yù)處理如果再深究下去,它的內(nèi)容可不止如此。

  庫(kù)函數(shù)的包含和本地頭文件的包含
前面我們也講到過(guò),用#include包含頭文件的時(shí)候,根據(jù)包含的頭文件到底是庫(kù)函數(shù)還是用戶自己寫(xiě)的本地頭文件分別有不同的包含方式。
如果用#include包含庫(kù)函數(shù),那么其包含的方式為:
#include <filename>    
對(duì)于filename不存在任何限制,不過(guò)根據(jù)約定,標(biāo)準(zhǔn)庫(kù)的庫(kù)文件以一個(gè).h后綴結(jié)尾。編譯器通過(guò)查找由編譯器定義的“一系列標(biāo)準(zhǔn)庫(kù)路徑”來(lái)查找?guī)旌瘮?shù)的頭文件。比如,在典型的UNIX/類UNIX系統(tǒng)上,C編譯器在/user/include/目錄中去查找?guī)旌瘮?shù)的頭文件。
如果是本地頭文件的包含,那么其包含方式為:
#include “filename”
這個(gè)頭文件如果和所有的源文件放置在一個(gè)目錄底下,那么就無(wú)需去顯式地指明其路徑。如果不在同一個(gè)文件夾下,那么UNIX和BorlandC編譯器都支持一種變體形式,即使用絕對(duì)地址的路徑名。如:
#include “../src/usart/ usart.h”

    頭文件的形式
再來(lái)想一想,C語(yǔ)言中的#include只能支持包含.h后綴的頭文件嗎?其實(shí)不然,除了C語(yǔ)言標(biāo)準(zhǔn)庫(kù)文件在編寫(xiě)時(shí)是按照約定以.h結(jié)尾的,用戶自己定義的頭文件根本就沒(méi)有這一條規(guī)定。比如圖2所示。

C語(yǔ)言中include能包含什么文件
圖2 C語(yǔ)言包含亂七八糟后綴名的頭文件

在圖2中大家可以看到,我在b.c這個(gè)C語(yǔ)言源文件里面包含了一個(gè)c.x的頭文件,這個(gè)c.x后綴名我自己也不知道是什么意思。但是奇怪的是,編譯器在做預(yù)處理的時(shí)候,竟然將c.x文件中的內(nèi)容正常的處理過(guò)來(lái)了,除了VSCode做代碼靜態(tài)解析的時(shí)候,有錯(cuò)誤提示之外,其他貌似什么事情都沒(méi)有發(fā)生。因此,在一個(gè).c文件里面用#include包含什么后綴的文件,在C語(yǔ)言里面沒(méi)有規(guī)定。只不過(guò)約定俗成,都用.h結(jié)尾的文件來(lái)當(dāng)頭文件而已。
但是,C語(yǔ)言中源文件的后綴名有明確要求,一定要用.c后綴的文件。

    頭文件里面的內(nèi)容
接下來(lái),最后一個(gè)內(nèi)容,頭文件里面到底可以用來(lái)寫(xiě)什么內(nèi)容。這個(gè)問(wèn)題非常玄乎,C語(yǔ)言也沒(méi)有規(guī)定,隨便你自己去寫(xiě)。我之前看到過(guò)有個(gè)哥們(一個(gè)半路出家的工程師)將函數(shù)全部定義在頭文件中。對(duì)于這樣的人才,我除了說(shuō)他天資聰穎,資質(zhì)過(guò)人,骨骼精奇這樣的褒義詞之外,根本就詞窮了。C語(yǔ)言的頭文件里面的的確確可以用來(lái)寫(xiě)函數(shù),你沒(méi)有聽(tīng)錯(cuò),我再寫(xiě)一遍,的的確確可以用來(lái)寫(xiě)函數(shù)。但是,這樣子寫(xiě)出來(lái)的函數(shù)很難被多個(gè)其它文件包含。這個(gè)問(wèn)題我本來(lái)不想展開(kāi)講解,因?yàn)闅μ?,我怕將這個(gè)反面教材正面化了。但是滿足大家的好奇,還是貼出來(lái)了,如圖3所示。
C語(yǔ)言中include能包含什么文件
圖3 反面教材

到此,相信大家對(duì)“C語(yǔ)言中include能包含什么文件”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI