編譯程式之前,先由預處理器檢查程式。根據程式中使用的預處理器指令,預處理器用符號縮略語所代表的內容替換程式中的縮略語。
1.編譯器的處理步驟:
(2)編譯器查詢反斜線後面緊跟換行符的例項並刪除這些例項。將多個物理行替換為乙個邏輯行。
(3)編譯器將文字劃分為預處理的語言符號(token)序列和空白字元及注釋序列(編譯器會將注釋序列替換為乙個空格字元。所以注釋序列可以出現在源**的任何地方)。
第三步:把源**翻譯為機器語言。第一步和第二步只是對源**檔案進行文字處理,進行字串方面的替換。真正的根據語義翻譯為機器語言是在這步。
2.預處理器(preprocessor)種類
預處理器可以使用反斜線和換行符組合可以橫跨多個物理行,但是其最終只占用乙個邏輯行。
第一部分:#define定義常量
#define使用引數:#define macro body 其中marco的格式類似函式.由name(args)組成。但是name和(之間不能有空格。括號內部和body一樣,可以有空格)
#運算子:常量字串中和引數相同的字元子串不會被替換為引數的字串形式。如果想在常量字串中使用引數字串,那麼ansi c允許在body中使用#符號。如果x為引數名,那麼#x就是相應的「x」。
##運算子:#是獲取引數的字串形式,而##是將兩個token拼接起來得到乙個新的token.
如 #define name(n) x n 中x n就是空格符隔開的兩個token。但是如果#define name(n) x ## n 就是將name(n)替換為xn.可變巨集:…和__va_args__
總結:第二部分:檔案包含 #include
第三部分:其它指令。因為系統變數多用巨集定義。所以它們多用於更改巨集定義。改變編譯時編譯環境,方便移植系統。
#line :指令用於重置由__line__和__file__巨集報告的行號和檔名 。#error:指令使預處理器發出一條錯誤訊息,該訊息包含指令中的文字。#warning:指令是預處理器發出一條警告訊息,該訊息包含指令中的文字。
第四部分:重要的c庫
c預處理器和c庫
1.翻譯程式第一步 在預處理之前,編譯器要進行幾部翻譯處理,主要完成以下三方面工作 第一 把源 中出現的字元對映到源字符集,處理多位元組字元和是c外觀更加國際化的三元字元擴充套件。第二 查詢反斜線後緊跟換行符的例項並刪除這些例項,即將類似下面的兩個物理行轉行成 printf it is a beat...
C 標準庫 預處理器
1.預處理器 1.1 使用 代表返回乙個帶引號的字串,如 define to string s s to string hello 可以表示成 hello 1.2 使用 代表連線前後的內容,如 define concatenate x,y x y concatenate 5,2 可以表示成52 1....
C 預處理器
偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...