天天看點

自己動手構造編譯系統:編譯、彙編與連結1.3.1 預編譯

<b>1.3.1  預編譯</b>

  

       gcc對源檔案的第一階段的處理是預編譯,主要是處理宏定義和檔案包含等資訊。指令格式如下:

$gcc –e hello.c

–o hello.i

  預編譯器将hello.c處理後輸出到檔案hello.i,hello.i檔案内容如下:

# 1

"hello.c"

"&lt;built-in&gt;"

"&lt;command-line&gt;"

……

extern int

printf (const char *__restrict __format, ...);

int main()

{

     printf("hello world!");

     return 0;

}

  比如檔案包含語句#include&lt;stdio.h&gt;,預編譯器會将stdio.h的檔案内容拷貝到#include語句聲明的位置。如果源檔案内使用#define語句定義了宏,預編譯器則将該宏的内容替換到其被引用的位置。如果宏定義本身使用了其他宏,則預編譯器需要将宏遞歸地展開。

  我們可以将預編譯的工作簡單地了解為源碼的文本替換,即将宏定義的内容替換到宏的引用位置。當然,這樣了解有一定的片面性,因為要考慮宏定義中使用其他宏的情況。事實上預編譯器的實作機制和編譯器有着很大的相似性,是以本書描述的編譯系統将重點放在源代碼的編譯上,不再獨立實作預編譯器。然而,我們需要清楚的事實是:一個完善的編譯器是需要預編譯器的。