#if 0 #end if


先說“#if 0/#if 1 ... #endif”的作用。

我們知道,C標准不提供C++里的“//.....”這樣的單行風格注釋而只提供“/*....*/”這樣的塊注釋功能。

通常使用“/*.......*/”寫代碼中說明性的注釋文字(注釋作用)以及在調試時關閉某段代碼對編譯器的可見性(屏蔽作用),

當然,這里所謂的“注釋作用”和“屏蔽作用”是我們從功能上下的主觀定義,對預處理器而言,兩者並無任何區別。

對於前者,因為“注釋”中不會再出現“注釋”和“需要屏蔽的代碼段”,所以不會有嵌套的需求,因此通常也不會有問題;

而對於后者,當我們在調試程序時需要“屏蔽”某段代碼時,該段代碼中可能包含着前述的“注釋”和/或“已被屏蔽的代碼段”,這時就產生了“/*......*/”嵌套使用的需求,

但SB的C標准恰恰不允許我們這么干。

當你試圖使用嵌套的塊注釋功能時,會發現預處理器把最外層注釋的開始和最內層注釋的結尾這兩者之間的內容處理成了注釋,而其后一直到最外層注釋結尾的內容被當作了“有效代碼”

舉例代碼如下:

 1 /*
 2 int Add(int a,int b)  3 {  4  return a+b;  5 }  6 /*這個函數不再使用  7 int Sum(int a,int b)  8 {  9  return a+b; 10 } 11 */
12 int Add2(int a,int b) 13 { 14     return a+b; 15 } 16 */

——這顯然會引起若干語法錯誤而導致編譯中止。

高手們開動腦筋想到了“#if 0 ... #endif”,它同樣由預處理器進行處理,同樣可以“屏蔽”一段代碼,你想把說明文字寫在里面也可以,這些和“/*........*/”一樣。

 1 #if (0)
 2 int  Add(int a,int b)  3 {  4     return a+b;  5 }  6 /*這個函數不再使用  7 int Sum(int a,int b)  8 {  9  return a+b; 10 } 11 */
12 int Add2(int a,int b) 13 { 14     return a+b; 15 } 16 #endif

但不一樣的是:第一它允許嵌套(層數上限由預處理器決定)、第二你隨時可以把“#if 0”改成“#if 1”來取消對某段代碼的“屏蔽”——很卓越的特性,快拋棄笨拙的“”吧!

它唯一的缺點就是在編輯器中沒有“注釋”該有的文本顯示樣式。

詳細拓展

當注釋掉大塊代碼時,使用"#if 0"比使用"/**/"要好,因為用"/**/"做大段的注釋要防止被注釋掉的代碼中有嵌套的"/**/",這會導致注釋掉的代碼區域不是你想要的范圍, 當被注釋掉的代碼很大時容易出現這種情況,特別是過一段時間后又修改該處代碼時更是如此。

 在這里順便對條件編譯(#ifdef, #else, #endif, #if等)進行說明。以下分3種情況:

情況1:
#ifdef _XXXX
...程序段1...
  #else
  ...程序段2...
  #endif
  這表明如果標識符_XXXX已被#define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。
  例:
  #define NUM
  .............
  .............
  .............
  #ifdef NUM
   printf("之前NUM有過定義啦!:) \n");
  #else
   printf("之前NUM沒有過定義!:( \n");
  #endif
  }
  如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時候,當然執行第一個printf。否則第二個printf將被執行。
  我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。
情況2:
  #ifndef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
  這里使用了#ifndef,表示的是if not def。當然是和#ifdef相反的狀況(如果沒有定義了標識符_XXXX,那么執行程序段1,否則執行程序段2)。例子就不舉了。
情況3:
  #if 常量
  ...程序段1...
  #else
  ...程序段2...
  #endif
  這里表示,如果常量為真(非0,隨便什么數字,只要不是0),
就執行程序段1,否則執行程序段2。
如果有#if需要頂格寫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM