C 中的編譯預處理命令

2021-04-15 11:42:06 字數 1808 閱讀 7299

c++中可以寫一些共編譯程式使用的命令:編譯預處理命令,這些命令並不是c++程式所要完成的功能,而是對於編譯過程給出指導,其功能有編譯預處理程式來完成。c++的編譯預處理命令主要有:檔案包含命令(#include),巨集定義(#define)以及條件編譯命令。下面分別對其做介紹:

*檔案包含命令(#include)

在c++中,乙個模組通常有兩個原始檔構成,乙個是.h檔案,用於存放模組的介面定義;另乙個是.cpp檔案,用於存放模組的實現。在乙個模組中要用到另乙個模組中定義的程式實體時,需要在前者的.cpp檔案中用檔案包含命令(#include)把後者的.h檔案包含進來。其格式為:#include《檔名》或#include"檔名"。檔案包含命令的含義是:在編譯前,用命令中的檔名所指定的檔案內容替換該命令,<>表示在系統指定的目錄下尋找該檔案,""表示先在包含#include命令的檔案目錄下尋找,若找不到在到系統指定的目錄下尋找。

*巨集定義(#define)

在c++中,巨集定義有四種格式

(1)define 《巨集名》 《文字串》 含義:在編譯前,把程式文字中出現《巨集名》的地方用《文字串》替換,主要用於符號常量的定義。如:define pi 3.14,程式中所有以pi為識別符號的單詞均被替換為3.14

(2)define 《巨集名》(《參數列》) 《文字串》 含義:在編譯前,把程式中出現《巨集名》的地方用《文字串》替換,並且,《文字串》中的引數(相當於形參)將替換成使用該《巨集名》的地方所提供的引數(相當於實參)。這種巨集定義主要解決對小函式呼叫效率不高的問題(使用內聯函式應該是替代該方案的乙個不錯選擇)。如:#define max(a,b) (((a)>(b))?(a):(b)) 注意不能寫成#define max(a,b) a>b?a:b 原因請看下例:10+max(x,y)+5,使用前者替換成10+(((x)>(y))?(x):(y))+5,後者則替換成10+x>y:?x:y+5,結果顯然不對。

(3)define 《巨集名》 含義:告訴編譯程式該《巨集名》已被定義,並不做任何的文字替換,其作用是實現條件編譯。

(4)#undef 《巨集名》 含義:取消某個巨集名的定義,其後的《巨集名》不再進行替換和不再有巨集定義。

*條件編譯

條件編譯主要有一下三個用途:

(1)處理某個.h檔案被多個原始檔重複包含的問題。例如對下面的myclass.h檔案由於在其中加入了myclass_h的條件編譯命令,這樣重複包含該標頭檔案多次就不會造成重複宣告或定義的問題。

//myclass.h

#ifndef myclass_h

#define myclass_h

...//myclass的宣告或定義

#endif

(2)基於多環境的程式編制

有一些程式需要在不同的環境(如window或unix等)中執行,而在不同的環境中實現某些功能的**是不同的,所以我們可以在同乙個程式中,對環境有關的**進行分別編寫,而與環境無關的**只編寫一次,在編譯時,由編譯程式根據不同的環境來選擇對程式中相應的與環境有關的**進行編譯,如下面的條件編譯命令

#ifdef windows

...//適合windows的**

#elif unix

...//適合unix的**

#elif solaris

...//適合solaris的**

#else

...//適合其他環境的**

#endif

...//與環境無關的**

(3)程式除錯利用下面這段條件編譯命令,可以只在除錯狀態下(定義了巨集名debug)執行"..."所代表的除錯資訊**,具體不多說,因為現在的ide功能很強大,除錯都是自帶的,而且非常好。

#ifdef debug

...//除錯資訊

#endif

C 中的編譯預處理

預處理程式又稱預處理器,它包含在編譯器中。預處理程式首先讀原始檔。預處理的輸出是 翻譯單元 它是存放在記憶體中的臨時檔案。編譯器接受預處理的輸出,並將源 轉換成包含機器語言指令的目標檔案。預處理程式對原始檔進行第1次處理,它處理的是預處理命令。c 提供的預處理命令主要有3種,分別是 檔案包含命令 巨...

C 中的預處理命令

參考文章 本篇主要學習預處理命令 一 基本知識 1 定義符號和取消符號定義的預處理指令 define 和 undef 2 條件編譯指令 if else endif之外,還有乙個 elif.必須包括一條 endif語句 3 region和 endregion 用於 摺疊,這個經常用 4 warning...

C 中的預處理命令

參考文章 本篇主要學習預處理命令 一 基本知識 1 定義符號和取消符號定義的預處理指令 define 和 undef 2 條件編譯指令 if else endif之外,還有乙個 elif.必須包括一條 endif語句 3 region和 endregion 用於 摺疊,這個經常用 4 warning...