C語言為什麼只需要include 就能使用裡面聲明的函數?


這是一個讓很多新手困惑的問題,然而只要知道C語言程序的整個構建過程(編譯只是構建過程中的一個子步驟),就很容易回答這個問題。

一個標準C語言程序的構建過程至少包括:預編譯、編譯、以及鏈接。預編譯時會解析你的

.c

(不包括

.h

文件)文件,對於編譯指令(如#pragma )將執行相應的檢測;對於include包含的

.h

文件,則會用文件內容替換你的這條include指令;對於宏將替換為定義的值。運行完預編譯程序之後會生成一個臨時(一般不會生成磁盤文件)文件並作為編譯器的輸入,開始編譯過程並根據

.C

文件生成二進制文件(windows下是obj文件,linux下一般是out文件)。然後開始進行鏈接過程,因為每個二進制文件都會包含一些符號和可執行代碼,鏈接程序會將這些二進制文件鏈接為一個可執行文件,或者庫文件。除了這幾個過程之外,現在編譯器還有優化等其它過程。

知道了整個過程,我們再來看題主的問題,

.h

文件中會聲明函數和全局變量,通過include就合併進了

.c

文件,但是一般沒有這些函數的具體實現,沒關係,到了鏈接階段,連接器會在其他二進制文件或庫文件中找這些函數的實現,如果找不到就會提示錯誤。而

stdio.h

對應的是標準庫,默認情況下會自動加入到搜索路徑,所以在使用者看來好像只要include就能直接使用一樣。

此外,現在一些功能強大的IDE更是對構建過程進行了很多功能擴展,下面是在VS2017中的一個例子,可見除了常規的4編譯和5鏈接外。還有針對其它文件的一些操作(這裡是添加了QT插件的結果),另外還可以在6處針對不同的事件添加一些自己的處理任務(通常是寫一個程序,然後將上一步的輸出文件作為輸入,並將處理後的輸出文件傳給下一個處理過程)。


編碼之道


主要是用來減少編譯錯誤。當然也可以直接用路徑搜索匹配,但是那個性能差。用了這個頭文件提高了性能


m3cc


簡單點就叫讀取格式只不過改個名字!

類似於創建一個文件包,名稱叫做in(屬性名稱)

那麼下面寫出流程,我要在裡面定義一個函數,在寫其他內容!

然後最後停止讀寫,並且輸出!

可以在中間寫個返回值,中斷,或插入各種各類的內容,反覆轉換讀取或者什麼鬼!

每個英文字母都一定參數!每個頭文件總共有2萬多個不同代碼搭配!每個英文代碼對應不同的二進制這是編譯後!

列如0000 .0001八位為一個字母,那麼總共最多實現64個控制,也就是說64個三級管輪流切換線路,每個控制擁有64根線,64個三級管其中溢出1個或者2個不等,主要用來控制切換線路到其它地方,比如我這個三級管是對應到上一層控制部分,那麼當三級管飽和時候就會通電上一組模塊形成串聯狀態,那麼就上一層控制模塊就會讀寫到你的內容!

不然計算機哪裡懂你幹嘛,線路切換叫做控制模塊,還有運算模塊,運算模塊就是純數字0123456789用四位就夠了因為最大不超過1111,還有運算符是控制運算符控制也屬於線路切換,不然計算機可不懂加減乘除法!最後一組是代數組abcd26個字母加大小寫,後面是語言指令代表法!

那麼規律是語言轉代數,代數轉數字,數字變成值就是那麼一個過程!十進制是內核運算,二進制是代表開關閉合沒有運算符,是通過十進制來控制,16進制是代表法!因為滿FF剛好是1111四個1,主要代表二進制佔用寬位為一組!


分享到:


相關文章: