-
1 # 與自然做鬥爭
-
2 # 仁見人愛
要搞清楚這個問題需要明白編譯程式碼時,編譯器都做了什麼事。
c語言編譯器分成幾個階段,你問的這涉及兩個階段,宏展開與連線編輯。
在宏擴充套件節點include宏指令會找到對應標頭檔案,並放入你引入的元檔案中。此階段可以用命令列輸出,如果你用gcc後面帶適合選項,出來就是擴展出來的檔案。這個選項我忘了,man一下或網上找一下,而且這階段的檔案有約定的名稱。而且生成的檔案開啟看,跟你自己寫的函式原型申明,宏定義是一樣樣的,不過這個標頭檔案內容做過相容處理,編譯最佳化處理等,看著會比我們自己寫的複雜。能肯定的是有需要呼叫函式或者型別申明。
連線編輯階段會到我們配置的庫檔案中找到相關程式碼,此處分兩種情況處理,動態庫與靜態褲。如果是動態庫生成一些符號引用放可執行程式中,以備可執行程式執行時正確載入動態庫,並正確查詢呼叫函式。如果是靜態庫直接把靜態庫編譯好的程式碼(已經是最佳化好的二進位制程式碼,這步我沒認證確認過,可能有誤),直接放在目標可執行程式碼中。最後編譯出來的可執行程式中一定就能找到我們需要的函式。
庫檔案Windows下unix或類unix系統下有約定的查詢目錄,如果庫不在這些查詢目錄下需要自己配或指定庫的查詢路徑。如果用VS需要配置專案或工作空間的查詢路徑,或者複製到約定路徑下。unix類unix系統兩種選擇,把庫複製到約定路徑下或編譯命令列中指定,如果搞makefile也需要在編譯命令列指定或者使用內建變數設定。
stdio預設使用動態庫,也可以指定靜態庫。
-
3 # 編碼之道
這是一個讓很多新手困惑的問題,然而只要知道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處針對不同的事件新增一些自己的處理任務(通常是寫一個程式,然後將上一步的輸出檔案作為輸入,並將處理後的輸出檔案傳給下一個處理過程)。
回覆列表
簡單點就叫讀取格式只不過改個名字!
類似於建立一個檔案包,名稱叫做in(屬性名稱)
那麼下面寫出流程,我要在裡面定義一個函式,在寫其他內容!
然後最後停止讀寫,並且輸出!
可以在中間寫個返回值,中斷,或插入各種各類的內容,反覆轉換讀取或者什麼鬼!
每個英文字母都一定引數!每個標頭檔案總共有2萬多個不同程式碼搭配!每個英文程式碼對應不同的二進位制這是編譯後!
列如0000 .0001八位為一個字母,那麼總共最多實現64個控制,也就是說64個三級管輪流切換線路,每個控制擁有64根線,64個三級管其中溢位1個或者2個不等,主要用來控制切換線路到其它地方,比如我這個三級管是對應到上一層控制部分,那麼當三級管飽和時候就會通電上一組模組形成串聯狀態,那麼就上一層控制模組就會讀寫到你的內容!
不然計算機哪裡懂你幹嘛,線路切換叫做控制模組,還有運算模組,運算模組就是純數字0123456789用四位就夠了因為最大不超過1111,還有運算子是控制運算子控制也屬於線路切換,不然計算機可不懂加減乘除法!最後一組是代陣列abcd26個字母加大小寫,後面是語言指令代表法!
那麼規律是語言轉代數,代數轉數字,數字變成值就是那麼一個過程!十進位制是核心運算,二進位制是代表開關閉合沒有運算子,是透過十進位制來控制,16進位制是代表法!因為滿FF剛好是1111四個1,主要代表二進位制佔用寬位為一組!