標(biāo)準(zhǔn)C和C++將編譯過程定義為9個(gè)階段(Phases of Translation):
1.字符映射(Character Mapping)
文件中的物理源字符被映射到源字符集中,其中包括三字符運(yùn)算符的替換、控制字符(行尾的回車換行)的替換。許多非美式鍵盤不支持基本源字符集中的一些字符,文件中可用三字符來代替這些基本源字符,以??為前導(dǎo)。但如果所用鍵盤是美式鍵盤,有些編譯器可能不對(duì)三字符進(jìn)行查找和替換,需要增加-trigraphs編譯參數(shù)。在C++程序中,任何不在基本源字符集中的字符都被它的通用字符名替換。
2.行合并(Line Splicing)
以反斜杠\結(jié)束的行和它接下來的行合并。
3.標(biāo)記化(Tokenization)
每一條注釋被一個(gè)單獨(dú)的空字符所替換。C++雙字符運(yùn)算符被識(shí)別為標(biāo)記(為了開發(fā)可讀性更強(qiáng)的程序,C++為非ASCII碼開發(fā)者定義了一套雙字符運(yùn)算符集和新的保留字集)。源代碼被分析成預(yù)處理標(biāo)記。
4.預(yù)處理(Preprocessing)
調(diào)用預(yù)處理指令并擴(kuò)展宏。使用#include指令包含的文件,重復(fù)步驟1到4。上述四個(gè)階段統(tǒng)稱為預(yù)處理階段。
5.字符集映射(Character-set Mapping)
源字符集成員、轉(zhuǎn)義序列被轉(zhuǎn)換成等價(jià)的執(zhí)行字符集成員。例如:'\a'在ASCII環(huán)境下會(huì)被轉(zhuǎn)換成值為一個(gè)字節(jié),值為7。
6.字符串連接(String Concatenation)
相鄰的字符串被連接。例如:"""hahaha""huohuohuo"將成為"hahahahuohuohuo"。
7.翻譯(Translation)
進(jìn)行語法和語義分析編譯,并翻譯成目標(biāo)代碼。
8.處理模板
處理模板實(shí)例。
9.連接(Linkage)
解決外部引用的問題,準(zhǔn)備好程序映像以便執(zhí)行。