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