C語言細節 程式設計機制 機製

2020-08-11 21:07:23
用C語言編寫程式時,編寫的內容被儲存在文字檔案中,該檔案被稱爲原始碼檔案(Source Code File)
在大部分環境中,原始碼檔名都應是<filename>.c的格式,其中<filename>是基本名,c是擴充套件名

一.目的碼檔案,可執行檔案和庫

C程式設計的基本策略是:用程式把原始碼檔案轉換爲可執行檔案(其中包含可直接執行的機器語言程式碼)
典型的C實現是通過編譯和鏈接這2個步驟來完成這一過程的
編譯器把原始碼轉換成中間程式碼;鏈接器把中間程式碼和其他程式碼合併,生成可執行檔案(通常由編譯器執行鏈接器)
這種方法便於對程式進行模組化,可以獨立編譯各模組,再用鏈接器合併;如果只更改某個模組,不必重新編譯其他模組
另外,鏈接器還將編寫的程式和預編譯的庫程式碼合併

假設只有1個原始碼檔案,則編譯和鏈接的過程如下(見下圖):
最普遍的中間檔案的形式是把原始碼轉換爲機器語言程式碼,並放在目的碼檔案(簡稱目標檔案)中
雖然目標檔案中包含機器語言程式碼,但不能直接執行該檔案,因爲其中儲存的是編譯器翻譯的原始碼,但還不是1個完整的程式
目的碼檔案缺失啓動程式碼(Startup Code):啓動程式碼充當着程式和操作系統間的介面
目的碼還缺少庫函數:幾乎所有C程式都需要使用庫函數,目的碼檔案並不包含庫函數的程式碼,而只包含使用庫函數的指令
庫函數真正的程式碼儲存在另1個被稱爲庫的檔案中
鏈接器的作用是把目的碼,系統的標準啓動程式碼,庫程式碼這3部分合併成1個檔案,即可執行檔案
對於庫程式碼,鏈接器只會把程式中要用到的庫函數的程式碼提取出來

在某些環境中,需要分別執行編譯程式和鏈接程式;在其他環境中,只需要給出編譯指令,編譯器會執行鏈接器

在这里插入图片描述
二.GNU與LLVM

GNU專案始於1987年,是1個開發大量自由UNIX軟體的集合(GNu的意思是"GNU's Not UNIX")
GNU編譯器集合(也稱GCC)是該專案的產品之,其中包含GCC C編譯器
GCC在1個指導委員會的帶領下,不斷地開發,其C編譯器緊跟C標準的改動
GCC有各種版本以適應不同的硬體平臺和操作系統,包括UNIX/Linux/Windows
用gcc命令便可呼叫GCC C編譯器,許多使用GCC的系統都使用cc作爲gcc的別名

LLWM專案是與編譯器相關的開源軟體集合,始於伊利諾伊大學2000年的研究專案,可替代GCC
其C1ang編譯器處理C程式碼,可通過clang命令呼叫,也對最新的C標準支援得很好
有多種版本供不同的平臺使用,包括Linux;2012年,Cang成爲FreeBSD的預設C編譯器

GNU和LLVM都可使用-v選項來顯示版本資訊,此外很多系統使用cc別名來代替gcc或clang
以下命令(之一)用於顯示正在使用的編譯器及其版本:
gcc -v
clang -v
cc -v

在Linux上使用gcc命令進行編譯:
gcc a.c    #a.c是原始碼檔名

gcc和c1ang命令都可以呼叫不同的C標準:
#以gcc爲例,clang的用法相同
gcc -std=c99 a.c    #呼叫C99標準#a.c是原始碼檔名
gcc -std=c1x a.c    #呼叫C11之前的草案標準
gcc -std=c11 a.c    #呼叫C11標準