C C 條件編譯

2021-10-09 02:36:14 字數 2984 閱讀 1719

04、巨集定義

05、總結

條件編譯是指預處理器根據條件編譯指令,有條件地選擇源程式**中的一部分**作為輸出,送給編譯器進行編譯。主要是為了有選擇性地執行相應操作,防止巨集替換內容(如檔案等)的重複包含。

常見的條件編譯指令如下:

條件編譯指令

描述(description)

#if如果條件為真,則執行相應操作

#elif

如果前面條件為假,而該條件為真,則執行相應操作

#else

如果前面條件均為假,則執行相應操作

#endif

結束相應的條件編譯指令

#ifdef

如果該巨集已定義,則執行相應操作

#ifndef

如果該巨集沒有定義,則執行相應操作

#define

定義乙個巨集

#undef

取消乙個巨集定義

嚴格來說,#define與undef不能算是真正的條件編譯,雖然他也是在編譯階段完成,下面介紹幾組常見的條件編譯組合。

3.1 #if——#else——#endif

#if 條件表示式

程式段1

#else

程式段2

#endif

#include

using

namespace std;

intmain()

上述這段簡單的程式,當#if旁邊為true,為真時,執行#if 下面的語句塊直到#else之上的所有。

當#if旁邊為false,為假時,執行#else下面的語句塊,直到#endif之上的所有。

3.2 #ifndef——#define——#endif

#ifndef 識別符號

#define 識別符號 替換列表

//...

#endif

#include

using

namespace std;

#ifndef max

//檢查是否已定義

#define max 1024

//沒有定義就使用該行

#endif

//結束標識

intmain()

該條件編譯指令更重要的乙個應用是防止標頭檔案重複包含。

如果 f.cpp 原始檔中包含 f1.h 和 f2.h 兩個標頭檔案,而 f1.h 標頭檔案及 f2.h 標頭檔案中均包含 x.h 標頭檔案,則 f.cpp 原始檔中重複包含 x.h 標頭檔案。可採用條件編譯指令,來避免標頭檔案的重複包含問題。所有標頭檔案中都按如下格式:

#ifndef _headname_h_

#define _headname_h_

//標頭檔案內容

#endif

code解釋:當該標頭檔案第一次被包含時,由於沒檢測到該頭檔名對應的符號(巨集名)headname_h,則定義該頭檔名對應的符號(巨集),其值為該系統預設。並且,該條件編譯指令選中 #endif 之前的標頭檔案內容;如果該標頭檔案再次被包含時,由於檢測到已存在以該頭檔名對應的符號(巨集名),則忽略該條件編譯指令之間的所有**,從而避免了重複包含。

3.3 #if——#elif——#else——endif

該條件編譯即是第一種的公升級版——puls版本

#if 條件表示式1

程式段 1

#elif 條件表示式2

程式段 2

#else

程式段3

#endif

#include

using

namespace std;

intmain()

上述程式就是第乙個的公升級版,想必,不難理解,就是判斷兩次,第一次為1,就不往下走,第一次若是為0,則判斷第二次,同上規則。

3.4 #ifdef——#endif

#ifdef 識別符號

程式段#endif

#ifdef n

#undef n

//程式段

#endif

code解釋:如果檢測到符號 n 已定義,則刪除其定義,並選中相應的程式段。

4.1 定義巨集(#define)

定義巨集分為兩種:

第一種:物件巨集(巨集常量定義)

第二種:函式巨集

物件巨集

不帶引數的巨集被稱為"物件巨集(objectlike macro)"。物件巨集多用於定義常量、通用標識。

例如:

// 常量定義

#define max_length 100

// 通用標識,日誌輸出巨集

#define slog printf

// 預編譯巨集

#define _debug

函式巨集

帶引數的巨集。利用巨集可以提高**的執行效率: 子程式的呼叫需要壓棧出棧, 這一過程如果過於頻繁會耗費掉大量的cpu運算資源。 所以一些**量小但執行頻繁的**如果採用帶引數巨集來實現會提高**的執行效率。但多數c++程式不推薦使用函式巨集,除錯上有一定難度,可考慮使用c++的inline代替之。

例如:

// 最小值函式

#define min(a,b) ((a)>(b)? (a):(b))

// 安全釋放記憶體函式

#define safe_delete(p) }

4.2 取消巨集(#undef)

關於undef上面的例子中已經有了,只是沒有說明,單一功能,刪除當前巨集。

這裡就不多說,上面例子中有示例。

當然巨集的底層還可以講的有很多,比如彙編剖析巨集。由於本人的知識水平有限,暫時只能侷限於上層使用了。如果有機會,有實力**彙編的時候,再進一步聊聊巨集的彙編。

C C 條件編譯

出處 有些程式在除錯 相容性 平台移植等情況下可能想要通過簡單地設定一些引數就生成乙個不同的軟體,這當然可以通過變數設定,把所有可能用到的 都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分 就沒必要把所有的 都寫進去,就可以用條件編譯,通過預編譯指令設定編譯條件,在不同的需要時編譯不同的 ...

C C 條件編譯

條件編譯就是指有條件的編譯,即根據條件去編譯 在編譯階段時就對 做出取捨,有的編譯,有的不編譯,這樣比寫成乙個個判斷函式更有效率,比如工程 大部分的地方都類似,只有個別語句因為使用的硬體版本不同,就可以使用條件編譯增加可移植性。條件編譯的 條件 可以是乙個表示式的值,也可以是乙個定義的巨集。對於前者...

C C 複習之 條件編譯

條件編譯功能對於程式的移植和裁剪時很有用的,檢視過 cos 作業系統的核心源 裡面大量使用了條件編譯,方便使用者根據自個的需要,對系統核心進行裁剪。條件編譯的3種形式 1 ifdef 識別符號 程式段1 else 程式段2 endif作用 如果指定的識別符號已經被 define命令定義,則編譯程式段...