C 的預處理

2022-08-01 09:39:11 字數 2493 閱讀 2019

**:

預處理是乙個處理和管理文字型原始檔的程式。通常被編譯器作為編譯處理的第一步所呼叫。預處理的工作過程叫做轉換,預處理器的工作就是把原始檔的文字分成一些標記。這些文字形式的標記用來定位預處理指令。

當把乙個原始檔編譯前,預處理經過以下4步:

1、字元對映:把所有原始檔字元轉化成內部方法表示的字串行。

2、行結合:任何以反斜槓字元\的後邊接行結束符(硬回車)結尾的行都與它後邊的行結合起來,形成單獨的行。這意味著反斜槓和行末硬回車結合時中間沒有空格。

3、符號化:預處理器辨認出原始檔中的每個預處理標記和空格,把程式中的命令都刪掉。

4、預處理:執行所有的預處理指令,在原始檔中把巨集展開為初始定義的值。

除空格外,乙個含有預處理指令的行中的第乙個字元必須是磅的符號#。在磅號和指令間可以加任何數量的空格。可以在原始檔的任何位置放置預處理指令,但是該指令只影響檔案中該指令之後的**。

可以在源**中使用#define指令定義乙個新的預處理符號。允許單獨定義標誌符,用於進行文字替換。除名稱標誌符外,也可以用於建立進行簡單文字替換的標誌符。乙個通常的用法是用於給操作符起乙個別名,使**更易讀。因為c++是資料型別概念很強的語言,而使用巨集來定義標誌符就不受c++中型別檢測機制的約束,所以會導致難於檢查的編碼錯誤。巨集的引數被稱為無型別引數,因為巨集傳送引數時不用指定引數。

條件編譯的基本思想是,在某處定義乙個標誌符,然後在源**中需要使用時,可以使用預處理指令來檢查該標誌符是否已經定義過。

標頭檔案為函式、結構、聯合以及類定義了介面,也定義了預處理巨集和外部變數,還有其他一些東西。如果在乙個模組標頭檔案包含部分定義了乙個實體,並且該實體也被其它模組定義,那麼編譯器就會阻塞,宣告在兩個或以上模組定義了標誌符。可以使用單一檔案包含或一次標頭檔案包含的技術,使用#ifdef和#defined指令來防止重複。標頭檔案中實施單一檔案包含的方法:

1、建立乙個標識的名稱,通常從頭檔名中匯出的。乙個典型的單一檔案包含標誌是在頭檔名前加一或兩個下劃線組成。

2、下劃線後邊是大寫的檔名。

3、在檔名後加下劃線來代替檔名中的「.」號。

4、再加上檔案的副檔名,是大寫字元,最後再加上兩個或更多的下劃線包圍起來。

5、在單一檔案標誌符前加#ifndef預處理指令,作為標頭檔案的開始。

6、在標頭檔案語句後可以定義新的標誌符。

7、標頭檔案最後加入相應的#endif來結束#ifndef指令。

巨集是乙個很有用的工具,但有時也會導致混亂。程式設計者經常使用巨集為常的難於輸入的語句建立別名,來使它們更短一些和看起來更有意義。長的巨集可以分幾行來寫,只要每行以乙個反斜槓加硬回車結尾。複雜的巨集能為函式指標建立別名,把複雜的資料宣告縮短為更易於控制的長度,甚至像函式一樣接收引數並返回乙個值。

巨集展開是預處理的最後一步完成的,生成乙個完全預處理過的文字並準備由編譯器將它轉換成二進位制目標**。當編譯器展開巨集時,它把巨集標誌符替換為完整的巨集所代表的預處理文字。當巨集有兩個引數時,應該在每個引數的兩邊使用圓括號來防止意外的邊界問題。

ansi定義了3種預處理操作符,第一種是defined。第二和第三種用來與指令#defined連線。三個操作符分別為:

1、defined操作符:檢測乙個操作符有沒有被定義。

2、串化操作符#:用於把擴充套件前的巨集引數轉化為文字型的串純量。只有當巨集帶有引數的時候才使用該操作符,以告訴處理器在實際傳送給巨集的引數兩邊加上引用標誌串化該引數。操作符#會把原句中的引號當作字元引號。

3、標記傳送操作符##:允許作為實際引數的標記連線起來形成其它的標記。有時也叫做合併或者串聯操作符,它將單獨的標記合併為乙個單個的、結合起來的的標記。在巨集定義時,不能在第乙個或最後乙個標記上使用這種操作符。標記的串聯發生在巨集擴充套件前,用它來生成新的、唯一的名字是有用的。

六個預先定義的巨集:

巨集名                     描述

__date__       原始檔編譯的日期

__file__          當前的原始檔名稱

__line__           當前原始檔行號

__stdc__     指定與ansi的標準c語言完全一致(大多數編譯器未定義)

__time__       當前原始檔最近修改日期

__timestamp__ 當前原始檔最近修改的日期和時間

字串行(一些鍵損壞時,可以替換)

符號     兩字串行     三字串行

%>            ??>

[           <:              ??(

]           :>              ??)

#          %:             ??=

##       %:%:      

\                            ??/

^                           ??'

|                            ??!

~                           ??-

?                           ???

c 預處理和預處理命令

預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式 character 預處理命令 one of define,undef,include,if,ifdef,ifndef,else,elif,e...

C 中的預處理

預處理器指示符用 標識,例如 include。處理這些指示符的程式被稱為 預處理器 通常預處理器是 在編譯器中的。include include file2.h 用尖括號 括起來來的,表明這個標頭檔案是乙個標準標頭檔案,查詢的時候會從預定義的目錄開始,我們可以通過設定路徑環境變數或命令列選項來修改這...

C 中的預處理

一 預處理的由來 在c 的歷史發展中,有很多的語言特徵 特別是語言的晦澀之處 來自於c語言,預處理就是其中的乙個。c 從c語言那裡把c語言預處理器繼承過來 c語言預處理器,被bjarne博士簡稱為cpp,不知道是不是c program preprocessor的簡稱 二 常見的預處理功能 預處理器的...