<b>1.3.1 預編譯</b>
gcc對源檔案的第一階段的處理是預編譯,主要是處理宏定義和檔案包含等資訊。指令格式如下:
$gcc –e hello.c
–o hello.i
預編譯器将hello.c處理後輸出到檔案hello.i,hello.i檔案内容如下:
# 1
"hello.c"
"<built-in>"
"<command-line>"
……
extern int
printf (const char *__restrict __format, ...);
int main()
{
printf("hello world!");
return 0;
}
比如檔案包含語句#include<stdio.h>,預編譯器會将stdio.h的檔案内容拷貝到#include語句聲明的位置。如果源檔案内使用#define語句定義了宏,預編譯器則将該宏的内容替換到其被引用的位置。如果宏定義本身使用了其他宏,則預編譯器需要将宏遞歸地展開。
我們可以将預編譯的工作簡單地了解為源碼的文本替換,即将宏定義的内容替換到宏的引用位置。當然,這樣了解有一定的片面性,因為要考慮宏定義中使用其他宏的情況。事實上預編譯器的實作機制和編譯器有着很大的相似性,是以本書描述的編譯系統将重點放在源代碼的編譯上,不再獨立實作預編譯器。然而,我們需要清楚的事實是:一個完善的編譯器是需要預編譯器的。