C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:5,277

條件編譯,C語言條件編譯詳解

條件編譯是指預處理器根據條件編譯指令,有條件地選擇源程序代碼中的一部分代碼作為輸出,送給編譯器進行編譯。主要是為了有選擇性地執行相應操作,防止宏替換內容(如文件等)的重復包含。常見的條件編譯指令如表 1 所示。

表 1 常見的條件編譯指令
條件編譯指令 說 明
#if 如果條件為真,則執行相應操作
#elif 如果前面條件為假,而該條件為真,則執行相應操作
#else 如果前面條件均為假,則執行相應操作
#endif 結束相應的條件編譯指令
#ifdef 如果該宏已定義,則執行相應操作
#ifndef 如果該宏沒有定義,則執行相應操作

#if-#else-#endif

其調用格式為:

#if 條件表達式
    程序段1
#else
    程序段2
#endif

功能為:如果#if后的條件表達式為真,則程序段 1 被選中,否則程序段 2 被選中。

注意,必須使用 #endif 結束該條件編譯指令。

例如:
#include<stdio.h>
#define RESULT 0//定義 RESULT 為 0
int main (void)
{
    #if !RESULT //或者 0==RESULT
        printf("It's False!\n");
    #else
        printf("It's True!\n");
    #endif //標志結束#if
        return 0;
}
上述程序中,首先定義了 RESULT 為 0,在 main 中使用 #if-#else-#endif 條件判斷語句,如果 RESULT 為 0,則輸出 It's False!,否則輸出 It's True!。本例輸出為:It's False!。

#ifndef-#define-#endif

其調用格式為:

#ifndef 標識符
#define 標識符 替換列表
    //...
#endif

功能為:一般用于檢測程序中是否已經定義了名字為某標識符的宏,如果沒有定義該宏,則定義該宏,并選中從 #define 開始到 #endif 之間的程序段;如果已定義,則不再重復定義該符號,且相應程序段不被選中。

例如:
#ifndef PI
#define PI 3.1416
#endif
上述程序段,用于判斷是否已經定義了名為 PI 的宏,如果沒有定義 PI,則執行如下宏定義。
#define PI 3.1416
如果檢測到已經定義了 PI,則不再重復執行上述宏定義。

該條件編譯指令更重要的一個應用是防止頭文件重復包含。

如果 f.c 源文件中包含 f1.h 和 f2.h 兩個頭文件,而 f1.h 頭文件及 f2.h 頭文件中均包含 x.h 頭文件,則 f.c 源文件中重復包含 x.h 頭文件。可采用條件編譯指令,來避免頭文件的重復包含問題。所有頭文件中都按如下格式:

#ifndef _HEADNAME_H_
#define _HEADNAME_H_
    //頭文件內容
#endif

當該頭文件第一次被包含時,由于沒檢測到該頭文件名對應的符號(宏名)_HEADNAME_H_,則定義該頭文件名對應的符號(宏),其值為該系統默認。并且,該條件編譯指令選中 #endif 之前的頭文件內容;如果該頭文件再次被包含時,由于檢測到已存在以該頭文件名對應的符號(宏名),則忽略該條件編譯指令之間的所有代碼,從而避免了重復包含。

#if-#elif-#else-#endif

其調用格式為:

#if 條件表達式1
    程序段 1
#elif 條件表達式2
    程序段 2
#else
    程序段3
#endif

功能為:先判斷條件1的值,如果為真,則程序段 1 被選中編譯;如果為假,而條件表達式 2 的值為真,則程序段 2 被選中編譯;其他情況,程序段 3 被選中編譯。

#ifdef-#endif

其調用格式為:

#ifdef 標識符
    程序段
#endif

功能為:如果檢測到已定義該標識符,則選擇執行相應程序段被選中編譯;否則,該程序段會被忽略。

例如:
#ifdef N
#undef N
    //程序段
#endif
功能:如果檢測到符號 N 已定義,則刪除其定義,并選中相應的程序段。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo