.h: 函式的 prototype,定義等。
.c: 函式的實際,.h 跟 .c 內容是高度相關的,但是把它分開寫是為了模組化,同時提高編譯器的編譯效率,等多個好處。
.i: 預處理 (preprocessing) 產生的檔案,預處理負責處理 #define #include 等相關的 statement,像是 include 就是真的把 include 的那個檔案寫進來 (通常是 header file),有這個 step 提高了很高的彈性,例如可以修改程式碼符合當前的執行環境。
.S: 組合語言檔案。
.o: object code,組合語言檔案透過 assembler 寫成 machine code 的檔案形式,但是 machine code file 還是不能直接執行,因為程式中可能呼叫某個檔案的函式,所以還要透過 linker 連接那些函式。linker 連接的方式又可以分為動態跟靜態連接。
.out .exe .elf: linker 連接後產生的檔案,linker 其實就是把一堆 .o file 捆綁在一起,.out 是舊的執行檔規範,現在 Unix-like 都是用 .elf,而 windows 則是用 .exe。
.a (靜態函式庫) .lib (windows 靜態函式庫) .so (動態共享函式庫) .dll (windows 動態共享函式庫): linker 有不同的連接方式,最簡單的是 link 另外一個 .o file,但也有提供其他連接方式,其他連接方式就會用到上述檔案類型,所以這些方式連接時是連接這些檔案,兩著差別請參考下列文章的截圖,他的文章講的更詳細,可以去看一下。