翻譯單元

1 簡述

C語言術語中, 翻譯單元指C編譯器產生目標文件(object file)的最終輸入。在非正式使用情況下,翻譯單元也叫編譯單元。一個編譯單元大致由一個經過C預處理器處理過的源文件組成,意味着由#include指令列出的頭文件會被正確的包含進來,由#ifdef指令包含的代碼會被包含進來,定義的宏會被展開。

2 上下文

由單元組成的C程序叫源文件(或者叫預處理文件),源文件除了源代碼以外,還包括C預處理指令。一個源文件經過預處理器處理後的輸出叫做翻譯單元。

預處理主要包括將一個源文件中由#include指令聲明的文件(通常是頭文件,也可能是其它源文件)遞歸地替換,產生的結果是一個預處理翻譯單元。接下來包括對#define指令進行宏展開,對#ifdef指令進行條件編譯等等這一步便將預處理翻譯單元轉換成一個翻譯單元。編譯器從翻譯單元產生一個目標文件,目標文件經過後續處理後鏈接(可能需要其它目標文件)成一個可執行程序。

需要注意的是預處理器是語言無關的,只是一個詞法處理器,只在詞法分析級別,它並不做語法分析,所以它不能處理具體的C語法。編譯單元做爲編譯器的輸入,它將不會看到任何預處理指令,因爲在編譯之前預處理指令已經被預處理器處理了。一個翻譯單元根本上是基於一個文件,實際輸入編譯器的源代碼可能和程序員所看到的大不一樣,特別是遞歸包含的頭文件。

3 範圍

翻譯單元定義了一個範圍,大致是文件範圍,功能上類似於模塊範圍;在C術語中稱爲內部連接,內部連接是C語言中兩種連接方式之一。在函數塊外聲明的名字(函數和變量)僅對該翻譯單元可見,稱爲內部連接,內部連接對鏈接器不可見。如果名字對其它翻譯單元可見,稱爲外部連接,外部連接對鏈接器可見。

C語言沒有模塊的概念。但是單獨的目標文件(翻譯單元產生的目標文件)功能也像一個獨立的模塊,如果一個源文件沒有包含其它源文件,內部連接(翻譯單元範圍)可能被認爲是包括所有頭文件的文件範圍。

4 代碼組織

大部分工程的代碼都是保存在以.c爲後綴(c++.cpp, .c++, 或 .cc,通常用.cpp)的文件中。被包含的文件一般以.h爲後綴(c++.hpp.hh, 在c++中通常用.h比較多),爲了避免多個源文件包含頭文件產生的名字衝突,頭文件中一般不包含函數或變量的定義。頭文件可以被其它頭文件包含。在項目中,.c文件至少包含一個頭文件是標準做法。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章