編譯—連結—載入工具鏈

編譯單元(translation unit)

當編譯器著手把你的程式碼轉成機器碼時,它不會一口氣吞下整個專案。它一次只處理一個自成一體的文字區塊。編譯單元正是這樣的一個區塊:它是前置處理器處理完單一原始檔之後,編譯器所看到的東西,意即那一個 .c 檔案加上它的 #include 行拉進來的一切,全部攤平成一大串文字。

所以如果你有一個引入了 stdio.h 與你自己的 utils.h 的 main.c,這個編譯單元就不只是你在 main.c 裡打的那幾行。它是你的程式碼連同 stdio.h 與 utils.h 全部被貼進來的內容,所有巨集都已展開、所有 #ifdef 區塊都已解析。編譯器讀完這整段攤平的文字,檢查其錯誤,並由它產生恰好一個目的檔。專案中的每個 .c 檔案都成為自己的編譯單元、自己的目的檔,各自獨立分開編譯。

這個概念是 C 與 C++ 程式如何建構的骨幹。它解釋了為何每個原始檔可以不靠其他檔案單獨編譯(分離編譯),為何在一個檔案中定義的函式必須在標頭檔中宣告才能讓其他檔案使用,以及為何有些錯誤由編譯器逐檔抓到,而另一些需要跨檔比對的錯誤,只在稍後連結器階段才浮現。一個常見的意外:static 函式或變數是它自己編譯單元的私有物,對其他單元而言根本不存在。

// main.c 一個編譯單元 = #include <stdio.h> // ~1000 行的 stdio.h #include "utils.h" // + 你的 utils.h 內容 int main(void) { ... } // + 這幾行,全部攤平在一起

一個原始檔加上它所有的 include,經前置處理後,就是單一個編譯單元。

每個編譯單元都是孤立編譯的,所以編譯器無法抓出某 .c 檔定義的函式與另一檔呼叫處之間的不一致;這種不一致只在連結器階段才浮現。

又称
compilation unit編譯單元翻譯單元