轉自:https://blog.csdn.net/zhangchiytu/article/details/7563329
先看個例子:
#define TARGET_LITTLE_ENDINA 1
#define TARGET_BIG_ENDINA 0
#ifdef TARGET_LITTLE_ENDINA
call little endina function
#else
call big endina function
#endif
不管把 TARGET_LITTLE_ENDINA 和 TARGET_BIG_ENDINA定義成0或者1,甚至后面不寫這個0或者1 ,調用的都是little endina函數,這段代碼是有問題的,就是沒有理解#if和#ifdef之間的區別。
#if 的使用說明
#if的后面接的是表達式,如果表達式為1,則編譯#if下面的代碼
1 #if (MAX==10)||(MAX==20) 2 ...code... 3 #endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么編譯器就會把其中的#if 與 #endif之間的代碼編譯進去(注意:是編譯進去,不是執行!!)
#ifdef 的說明
#ifdef 后面接的是一個宏
1 #ifdef (x) 2 ...code... 3 #endif
這個#ifdef 它不管里面的“x”的邏輯是“真”還是“假”,它只管這個程序前面的宏定義里面有沒有定義“x”這個宏(即在這里#define x 1和#define x 0等效,都等同於#define x)。
如果定義了x這個宏,那么編譯器會編譯中間的…code…否則直接忽視中間的…code…代碼。
#if defined的使用
#if defined() 的使用和#ifdef的用法一致
#if !defined()又和 #ifndef 的用法一致。
最后強調兩點:
第一:這幾個宏定義只是決定代碼塊是否被編譯!
第二:別忘了#endif
#ifdef 的用法
靈活使用#ifdef指示符,我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。define.cpp文件:
1 #include "iostream.h" 2 int main() 3 { 4 #ifdef DEBUG 5 cout<< "Beginning execution of main()"; 6 #endif 7 return 0; 8 }
運行結果:Press any key to continue
改寫代碼如下:
1 #include "iostream.h" 2 #define DEBUG 3 int main() 4 { 5 #ifdef DEBUG 6 cout<< "Beginning execution of main()"; 7 #endif 8 return 0; 9 }
運行結果為:Beginning execution of main()
Press any key to continue
更一般的情況是,#define語句是包含在一個特定的頭文件中。
比如,新建頭文件head.h,在文件中加入代碼:
1 #ifndef DEBUG 2 #define DEBUG 3 #endif
而在define.cpp源文件中,代碼修改如下:
1 #include "iostream.h" 2 #include "head.h" 3 int main() 4 { 5 #ifdef DEBUG 6 cout<< "Beginning execution of main()"; 7 #endif 8 return 0; 9 }
運行結果如下:Beginning execution of main()
Press any key to continue
結論:通過使用#ifdef指示符,我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。
================================================================================
為各個版本的軟件升級工作是很困難的,因為這些補丁程序都是在一套軟件的基礎上不斷地修改與擴充而編寫的,並由不同的標志文件轉入到不同的模塊,雖然程序 體積在不斷擴大,但絲毫不影響老用戶的功能,這主要是得益於C程序的#ifdef/#else/#endif的作用。
我們主要使用以下幾種方法,假設我們已在程序首部定義#ifdef DEBUG與#ifdef TEST:
1.利用#ifdef/#endif將某程序功能模塊包括進去,以向某用戶提供該功能。
在程序首部定義#ifdef HNLD:
1 #define HNLD 2 3 #ifdef HNLD 4 #include"n166_hn.c" 5 #endif
如果不許向別的用戶提供該功能,則在編譯之前將首部的HNLD加一下划線即可。
2.在每一個子程序前加上標記,以便追蹤程序的運行。
1 #ifdef DEBUG 2 printf(" Now is in hunan !"); 3 #endif
3.避開硬件的限制。有時一些具體應用環境的硬件不一樣,但限於條件,本地缺乏這種設備,於是繞過硬件,直接寫出預期結果。具體做法是:
1 #ifndef TEST 2 i=dial(); //程序調試運行時繞過此語句 3 #else 4 i=0; 5 #endif
調試通過后,再屏蔽TEST的定義並重新編譯,即可發給用戶使用了。
明白了之間的區別問題就變得非常的容易,修改上述代碼只要把其中的#ifdef改成#if就可以達到目的。