本文綜合參考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;
/*這是一個外層註釋
/*
int *b=&a; //這是一個內層代碼註釋
*b = 10;
*/
a++;
*/
}
這段代碼的註釋是有問題的,因爲註釋符頭 " / * "是根據最近結束符 " */ "來判斷註釋的區域的,但是一但內嵌了就會發現錯誤。所以人們就使用了#if 0,如下:
#include“stdio.h”
int main()
{
int a=11;
/*這是一個外層註釋
#if 0
int *b=&a; //這是一個內層代碼註釋
*b = 10;
#endif
a++;
*/
}
但是,#if就只有這個作用嗎?有些書籍呼籲人們儘量少用它,那不是沒有什麼意義了?
其實不是的,在有些地方很常見到它,而且少不了它。當你見識過系統級的源代碼就煥然大悟了。對,就是用於系統裁剪。系統裁剪是針對系統的用途,對系統的源代碼進行一下優化,減少不必要的功能。
#if是一個最經典的例子。如:
/*--------------------------------------------------------------------*/
#include“stdio.h”
#define TEST_2 1
int main()
{
int a=11;
/*這是一個外層註釋
#if TEST_2
int *b=&a;
*b = 10;
#endif
a++;
*/
}
/*----------------------------------------------------------------------*/
如上面的例子,對於某些功能不需要,我們只需對於的功能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