天天看點

#if 0...#endif #if defined()...#endif #ifdef...#endif #ifndef...#endif 等的用法

本文綜合參考http://blog.csdn.net/raining_heart/article/details/8019535和http://quanminchaoren.iteye.com/blog/1870977兩篇文章,非常感謝原文作者!

最近在看MTK源代碼,發現裡面很多#if 0...#endif    #if defined()...#endif    #ifdef...#endif    #ifndef...#endif    

#if !defined()...#endif  ,下面逐個來讨論。

1、#if 0...#endif

#if 0...#endif的作用與注釋是一樣的,有些人說使用#if 0...#endif可以進行嵌套注釋,在平時使用注釋時是不能進行嵌套注釋的

#include“stdio.h”

int main()

{

            int  a=11;

             a++;

*/

}

這段代碼的注釋是有問題的,因為注釋符頭 " / *  "是根據最近結束符 " */  "來判斷注釋的區域的,但是一但内嵌了就會發現錯誤。是以人們就使用了#if 0,如下:

#include“stdio.h”

int main()

{

             int  a=11;

}

但是,#if就隻有這個作用嗎?有些書籍呼籲人們盡量少用它,那不是沒有什麼意義了?

其實不是的,在有些地方很常見到它,而且少不了它。當你見識過系統級的源代碼就煥然大悟了。對,就是用于系統裁剪。系統裁剪是針對系統的用途,對系統的源代碼進行一下優化,減少不必要的功能。

#if是一個最經典的例子。如:

#include“stdio.h”

#define TEST_2    1

int main()

{

            int  a=11;

}

如上面的例子,對于某些功能不需要,我們隻需對于的功能TEST_2的宏定義改成0,然後重新編譯就行了。當然一般宏定義是放在一個特定的檔案(這裡為了簡單就寫在一起),這樣外面的人隻需要更改那個檔案所對應的值就行對系統進行裁剪而不需要關心具體代碼,就行實作裁剪。

除了0之外,if後面也可以接其它的

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

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

 2、#if defined()...#endif 等的用法

#if後面接的是一個宏。

#if defined (x)
    ...code...
#endif
      

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

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

#ifdef的使用

#ifdef的使用和#if defined()的用法一緻

#ifndef又和#if !defined()的用法一緻。

最後強調兩點:

第一:這幾個宏定義隻是決定代碼塊是否被編譯!

第二:别忘了#endif