c 預編譯處理

2021-10-19 11:33:36 字數 2913 閱讀 4327

.定義

預編譯又稱為預處理 , 是做些**文字的替換工作。處理 # 開頭的指令 , 比如拷貝 #include 包含的檔案**, #define 巨集定義的替換 , 條件編譯等,就是為編譯做的預備工作的階段,主要處理#開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置,其存放在記憶體中的臨時檔案。

預處理指令是以#號開頭的**行。#號必須是該行除了任何空白字元外的第乙個字元。#後是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字元。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源**做某些轉換。

下面是部分預處理指令:

指令             用途

# 空指令,無任何效果

#include 包含乙個源**檔案

#define 定義巨集

#undef 取消已定義的巨集

#if 如果給定條件為真,則編譯下面**

#ifdef 如果巨集已經定義,則編譯下面**

#ifndef 如果巨集沒有定義,則編譯下面**,通常用於避免重複包含標頭檔案

#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面**

#endif 結束乙個#if……#else條件編譯塊

#error 停止編譯並顯示錯誤資訊

c++提供的預處理命令主要有3種:檔案包含命令(標頭檔案),巨集定義命令,條件編譯命令。

1.檔案包含命令(標頭檔案)

所謂「檔案包含」是指將另乙個源程式的內容合併到源程式中。c++程式提供了#include命令用於實現檔案包含的操作它有下列兩種格式:

●#include 《檔名》

●#include 「檔名」

檔名一般以「.h」為副檔名,因而稱它為「標頭檔案」。

第一種形式使用「<>」將檔名括起來。這些標頭檔案一般存在於c++系統目錄中的include子目錄。c++預處理程式遇到這條命令後,就到include子目錄中搜尋給出的檔案,並把它嵌入到當前檔案中。這種形式也是標準形式。

第二種形式使用雙引號將檔名括起來。預處理程式遇到這種格式的包含命令後,首先在當前檔案所在目錄中搜尋,如果找不到,再按標準方式進行搜尋。這種方式適合用於使用者編寫的標頭檔案。

#include檔案可以巢狀,即在乙個被包含的檔案中可以包含另乙個檔案。

2.巨集定義命令

c++ 巨集定義將乙個識別符號定義為乙個字串,源程式中的該識別符號均以指定的字串來代替。因此預處理命令後通常不加分號。這並不是說所有的預處理命令後都不能有分號出現。由於巨集定義只是用巨集名對乙個字串進行簡單的替換,因此如果在巨集定義命令後加了分號,將會連同分號一起進行置換

#define預處理指令是用來定義巨集的。該指令最簡單的格式是:首先神明乙個識別符號,然後給出這個識別符號代表的**。在後面的源**中,就用這些**來替代該識別符號。這種巨集把程式中要用到的一些全域性值提取出來,賦給一些記憶識別符號。

#define      min(a, b)     ((a) <= (b)? (a):(b))
注:巨集指令只是做一般替換,替換是不會區分型別的,如:

#define add(x, y) x + y

#define mul(x, y) x * y

int main (

int argc,

char

*ar**)

用#define來定義函式的優缺點:

優點:可完成函式呼叫的功能,又能減少系統開銷,提高執行效率。因為它是在預處理階段即進行了巨集展開,在執行時不需要轉換,即在當地執行。

缺點:所占用的目標**空間相對較大

犧牲空間來換取時間

3.條件編譯指令

條件編譯指令將決定那些**被編譯,而哪些是不被編譯的。可以根據表示式的值或者某個特定的巨集是否被定義來確定編譯條件。

1)#if指令

#if指令檢測跟在製造另關鍵字後的常量表示式。如果表示式為真,則編譯後面的**,直到出現#else、#elif或#endif為止;否則就不編譯。

2)#endif指令

#endif用於終止#if預處理指令。

#define debug 0    

//定義了乙個巨集

main()

//由於程式定義debug巨集代表0,所以#if條件為假,不編譯後面的**直到#endif,所以程式直接輸出running。如果去掉#define語句,效果是一樣的。

3)#ifdef和#ifndef

#define debug  

//定義了乙個巨集

main()

// #if defined等價於#ifdef; #if !defined等價於#ifndef

4)#else指令

#else指令用於某個#if指令之後,當前面的#if指令的條件不為真時,就編譯#else後面的**。#endif指令將中指上面的條件塊

#define debug

main()

//#else,#elif和endif是一樣的

5)#elif指令

#elif預處理指令綜合了#else和#if指令的作用。

#define two

main()

// 程式很好理解,最後輸出結果是2。

6)其他一些標準指令

#error指令將使編譯器顯示一條錯誤資訊,然後停止編譯。

#line指令可以改變編譯器用來指出警告和錯誤資訊的檔案號和行號。

#pragma指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告資訊

預處理預編譯(C )

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

預編譯處理

1.編譯過程的簡介 預編譯 a.處理所有的注釋,以空格代替。b.將所有 define刪除,並展開所有的巨集定義,字串替換。c.處理條件編譯指令 if,ifdef,elif,else,endif d.處理 include,並展開被包含的檔案,把頭檔案中的宣告,全部拷貝到檔案中。e.保留編譯器需要使用的...

stdafx h預編譯處理

stdafx.h中沒有函式庫,只是定義了一些環境引數,使得編譯出來的程式能在32位的作業系統環境下執行。windows和mfc的include檔案都非常大,即使有乙個快速的處理程式,編譯程式也要花費相當長的時間來完成工作。由於每個.cpp檔案都包含相同的include檔案,為每個.cpp檔案都重複處...