1. 程式人生 > >C/C++中常見的#if、if、#ifdef、#if define等區別

C/C++中常見的#if、if、#ifdef、#if define等區別

#if 與 if

條件編譯是C語言中預處理部分的內容,它是編譯器編譯程式碼時最先處理的部分,

條件編譯裡面有判斷語句,比如 #if 、#else 、#elif 及 #endif

它的意思是如果巨集條件符合,編譯器就編譯這段程式碼,否則,編譯器就忽略這段程式碼而不編譯,如

  1. #define A 0 //把A定義為0
  2. #if (A > 1)
  3. printf("A > 1"); //編譯器沒有編譯該語句,該語句不生成彙編程式碼
  4. #elif (A == 1)
  5. printf("A == 1"); //編譯器沒有編譯該語句,該語句不生成彙編程式碼
  6. #else
  7. printf("A < 1"
    ); //編譯器編譯了這段程式碼,且生成了彙編程式碼,執行該語句
  8. #endif

而 if 語句則不然,if 是 C 語言中的關鍵字,它根據表示式的計算結果來覺定執行那個語句,它裡面的每個分支都編譯了的, 如

  1. #define A 0
  2. if (A > 1)
  3. printf("A > 1"); //編譯器編譯該語句,但因為A == 0 未執行
  4. else if(A == 1)
  5. printf("A == 1"); //編譯器編譯該語句,但因為A == 0 未執行
  6. else
  7. printf("A < 1"); //編譯器編譯該語句,因為A == 0 故執行

作為一個編譯“開關”(常用來註釋程式碼),比如:

  1. #if(條件滿足)
  2. 執行程式碼1
  3. #else
  4. 執行程式碼2
  5. #endif

假如編譯時,確實滿足條件(結果非0時),則生成的程式檔案(.exe檔案)中不會有執行程式碼2的。如果用普通if語句,生成的程式檔案就會有執行程式碼2,這個區別看看生成檔案大小就可以知道。如果你的條件在程式編譯前就已經確定了,那就用#if;如果條件需要在程式執行過程中才能判斷,則用if。

所以 簡單地講,條件編譯是根據 巨集條件 選擇性地編譯語句,它是編譯器在編譯程式碼時完成的;

條件語句是根據條件表示式選擇性地執行語句,它是在程式執行時進行的。

#if的使用說明

#if的後面接的是表示式

  1. #if (MAX==10)||(MAX==20)
  2. code...
  3. #endif

它的作用是:如果(MAX==10)||(MAX==20)成立,那麼編譯器就會把其中的#if 與 #endif之間的程式碼編譯進去(注意:是編譯進去,不是執行!!)

#if defined的使用

#if後面接的是一個巨集。

  1. #if defined (x)
  2. ...code...
  3. #endif

這個#if defined它不管裡面的“x”的邏輯是“真”還是“假”它只管這個程式的前面的巨集定義裡面有沒有定義“x”這個巨集,如果定義了x這個巨集,那麼,編譯器會編譯中間的…code…否則不直接忽視中間的…code…程式碼。

另外 #if defined(x)也可以取反,也就用 #if !defined(x)

#ifdef的使用

#ifdef的使用和#if defined()的用法一致 
#ifndef又和#if !defined()的用法一致。

最後強調兩點: 
第一:這幾個巨集定義只是決定程式碼塊是否被編譯! 
第二:別忘了#endif