之所有有這兩個步驟因為幾乎任何壹個程序都不是用壹個原文件寫出來的。compile是先針對單獨原文件進行處理。link是把compile處理的結果組合成壹個完整的可執行文件。
其實C/C++完全也可以壹步成型,不需要compile和link兩個步驟,但是那樣的後果就是:壹,每次生成可執行程序,必須翻譯全部源代碼;二,C語言的執行庫(printf, scanf這些)必須都以源代碼形式存在。這怎麽樣也說不過去吧。
另外頭文件不屬於compile和link過程,頭文件是預編譯過程的文件。
C/C++語言的完整編譯過程是
壹、預編譯
處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。
二、編譯
把上面那個原文件編譯成.o或者VC裏是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變量的描述、乃至段的描述等等。
三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到壹起。(這裏也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合壹些其他數據,比如資源、可執行文件頭等等。