C語言之預處理指令

2021-10-05 09:12:09 字數 2205 閱讀 3874

在通常的概念中,預處理器是編譯器的 一部分,其實還不到編譯階段,只是單純的原始檔翻譯。展開操作,還不到真正編譯的語法分析,語義分析等階段。需要完全明確的是都在預處理進行原始檔文字處理階段,還不到編譯階段。

c語言中的預處理指令如下:

1:#開頭

2:define,undef,include,if ifdef,ifndef,else,elif,endif,line,error,pragma

3:實參

4:換行符

預處理器主要功能如下:注意預處理器只處理原始檔

1:條件性編譯原始檔部分,以#if ,#ifdef,#ifndef,#else,#elif,#endif

2:替換文字巨集,以指令#define,#undef,還有運算子#,##

3:包含其他檔案 #include

4:導致錯誤 #error

5:實現定義行為 主要是#pragma

5:檔名和行資訊,主要是#line

#if ,#ifdef,#ifndef,#else,#elif,#endif,

if和elif後跟表示式,ifdef,ifndef跟識別符號

#if 、 #ifdef 及 #ifndef 指令測試指定條件,如果指定的條件求值為 true ,則編譯控制的**塊。這種情況下忽略後續的 #else 和 #elif 指令。反之,如果指定的條件求值為 false ,則跳過控制的**塊,並處理後續的 #else 或 #elif 指令(若存在)。在前一情況下,無條件編譯 #else 指令控制的**塊。在後一情況下, #elif 指令的作用就像是乙個 #if 指令:檢查條件,基於結果編譯或跳過控制的**塊,然後在後一情況下處理後續的 #elif 和 #else 指令。條件預處理塊以 #endif 指令終止

注意的是:

表示式 是常量表示式,僅使用常量和用 #define 指令定義的識別符號。任何非常量,未以 #define 指令定義的識別符號,求值為0。

表示式可以含有形式為 defined 識別符號 或 defined (識別符號) 的一元運算子,若用 #define 指令定義了該 識別符號 ,則返回 1 ,否則返回 0 。若 表示式 求值為非零值,則包含該控制**塊並跳過其他。若所用的任何識別符號不是常量,則用 ​0​ 替換它。

#ifdef, #ifndef

檢查是否用 #define 指令定義了識別符號。

#ifdef 識別符號 本質上等價於 #if defined 識別符號 。

#ifndef 識別符號 本質上等價於 #if !defined 識別符號 。

#define,#undef

#define 識別符號 替換列表(可選)

#define 指令定義 識別符號 為巨集,即它們指示編譯器將所有 識別符號 的後繼出現替換為 替換列表 ,可以可選地附加地處理。若已定義該識別符號為任何型別的巨集,則程式為病式,除非定義相同。

需要注意#與##的區別,主要在定義函式巨集方面匹配引數的時候

有引數的巨集,注意是替換

#define 識別符號(引數) 替換列表

object-like macros

function-like macros

函式與類函式巨集,inline函式的區別:

1:函式是在編譯期間進行處理,生成可執行**

2:類函式巨集,只是在預處理階段進行替換,在用到巨集的地方進行引數替換和字串替換,方便程式設計師輸入同樣的**,所以取名為function-like

3:inline函式是函式,只是在呼叫的地方,在編譯階段,將函式體**直接帶入,不是用函式呼叫的方式進行函式呼叫,即省略了函式呼叫的實參到形參,堆疊呼叫等方式,有利於提高執行效率

#define count(m) m*m

int x=6;

intmain()

//預處理後,count(x+1)被展開成count(x+1*x+1),注意是將x+1作為整體進行形參直接替換,而沒有括號之類的優先順序

#include

#include

#include 「filename」

,主要只庫目錄或者在編譯選項在確定的目錄

"filename"先搜尋當前目錄,當前目錄不存在,在搜尋標準目錄

#error

實現在預處理階段遇到 #error 指令後,顯示診斷訊息 錯誤訊息 ,

#pragma

由 #pragma 指令控制編譯器實現定義行為。,注意區別是在編譯階段,不是預處理階段

#line

在預處理器中更改當前行號和檔名

c語言之預處理指令

c語言的預處理指令 有 巨集定義 檔案包含 條件編譯 巨集定義分為兩類 1 不帶引數的巨集定義 2 帶引數的巨集定義 巨集定義的格式 一般形式 define 巨集名 字串 作用 在編譯預處理的時候,將巨集名替換成右邊的字串 注意 巨集名一般大寫字母 巨集名在編譯預處理的時候不做編譯檢查,只做巨集名字...

C語言之預處理

預處理指令 在 編譯 0和1 之前執行的指令叫預處理指令。所有的預處理指令都是以 開頭。預處理的位置是隨便寫的 預處理指令的作用域 從編寫指令的那一行開始一直到檔案結尾 undef 巨集名 從這行 開始,巨集失效 巨集名一般用大寫 或者在巨集名前加 k 代表常量 變數名一般用小寫 一 巨集定義 格式...

C語言之預處理

預處理是c語言 也包括oc 的一部分,它們是一些特殊的命令.在編譯器對c程式 或者 oc程式 進行編譯之前,編譯器會對這些預處理命令進行處理,然後將這些處理的結構與源程式一起進行編譯.預處理命令有如下特徵.1 預處理命令必須以 號開頭 2 預處理通常位於程式的開頭部分 下面一起來看一下幾種使用情況 ...