?
This document uses PHP Chinese website manual Release
C源文件由編譯器進行處理,就像下面的階段發(fā)生一樣,按照這個順序。只要行為相同,實際實施可能會將這些行為組合起來或進行不同的處理。
1)源代碼文件(通常是一些多字節(jié)編碼中的文本文件,如UTF-8)的單個字節(jié)以實現(xiàn)定義的方式映射到源字符集的字符。特別是,依賴于操作系統(tǒng)的行尾指示符被換行符替換。的源代碼字符集是一個多字節(jié)字符集,其包括基本的源字符集作為一個單字節(jié)子集,其由以下96個字符的:
a)5個空格字符(空格,水平制表符,垂直制表符,換頁符,換行符)
b)由10位的字符'0'
,以'9'
C)52頁的信件從'a'
到'z'
并且從'A'
至'Z'
d)29個標點符號: _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’
2)三字母序列被相應的單字符表示替換。
1)每行尾部出現(xiàn)反斜杠(緊接著換行符后面),刪除反斜杠和換行符,將兩條物理源代碼行組合成一條邏輯源代碼行。這是一次單程操作:以兩條反斜杠結(jié)尾并且后跟一條空行的行不會將三行合并為一行。
2)如果一個非空的源文件在這一步之后沒有以換行符結(jié)尾(不管它最初沒有換行符,還是以反斜杠結(jié)束),那么行為是不確定的。
源文件被分解為注釋,空白字符序列(空格,水平制表符,換行符,垂直制表符和換頁符)以及預處理標記,這些符號如下
標題名稱:<stdio.h>
或"myfile.h"
標識符
數(shù)字
字符常量和字符串文字
運營商和標點符號(包括替代令牌),例如+
,<<=
,<%
,##
,或and
。
不符合任何其他類別的單個非空白字符
每個評論被一個空格字符替換
保留換行符,并且它的實現(xiàn)定義了非新行空白序列是否可以折疊為單個空格字符。
1)執(zhí)行預處理器。
2)使用#include指令引入的每個文件都會遞歸執(zhí)行階段1到4。
3)在這個階段結(jié)束時,所有預處理器指令都從源代碼中刪除。
1)字符常量和字符串文本中的所有字符和轉(zhuǎn)義序列都從源字符集轉(zhuǎn)換為執(zhí)行字符集(可能是多字節(jié)字符集,例如UTF-8,只要列出基本源字符集中的所有96個字符在階段1中具有單字節(jié)表示)。如果轉(zhuǎn)義序列指定的字符不是執(zhí)行字符集的成員,則結(jié)果是實現(xiàn)定義的,但保證不是空(寬)字符。
注意:在這個階段執(zhí)行的轉(zhuǎn)換可以通過某些實現(xiàn)中的命令行選項來控制:gcc和clang用于-finput-charset
指定源字符集的編碼,-fexec-charset
并-fwide-exec-charset
指定字符串中的執(zhí)行字符集編碼和字符文字沒有編碼前綴(自C11開始)。
相鄰的字符串文字是連接的。
編譯發(fā)生:令牌在語法和語義上被分析并翻譯為翻譯單元。
鏈接發(fā)生:滿足外部引用所需的翻譯單元和庫組件被收集到一個程序映像中,該映像包含在其執(zhí)行環(huán)境(OS)中執(zhí)行所需的信息。