#if和#ifdef的區別


學習STM32偶然發現:在Keil中直接預先定義宏USE_STDPERIPH_DRIVER,但是卻沒有指定宏的值。而在頭文件中判斷用的是如下代碼:

1 #ifdef USE_STDPERIPH_DRIVER
2   #include "stm32f4xx_conf.h"
3 #endif /* USE_STDPERIPH_DRIVER */

由此引發對#if和#ifdef的思考:這兩者有什么區別?

1、#ifdef指令說明:如果預處理器已經定義了后面的標識符,那么執行所有指令並編譯C代碼,直到下一個#else或者#endif出現為止(無論#else和#endif誰先出現)。如果有#else指令,那么,在未定義標識符時會執行#else和#endif之間的所有代碼。(C Primer Plus中文版(第五版) 人民郵電出版社 P460)

從以上的說明中可以總結以下幾點:

1)#ifdef只是判斷后面的標識符有沒有定義,而不在乎標識符的值,標識符是0是1對它來說都沒有區別,只要預先定義了,執行#ifdef后的代碼;

2)#ifdef是和#else搭配使用的,沒有#elif搭配之說;

3)#ifdef必須要有#endif配合使用;

示例說明:

1)

 1 #define IFTEST1        0
 2 #define IFTEST2        1
 3 
 4 int main()
 5 {
 6 #ifdef IFTEST1
 7     printf("ifdef: %d\n", IFTEST1);
 8 #else
 9     printf("ifdef: not defined!\n");
10 #endif
11     return 0;
12 }

2)

 1 //#define IFTEST1        0
 2 #define IFTEST2        1
 3 
 4 int main()
 5 {
 6 #ifdef IFTEST1
 7     printf("ifdef: %d\n", IFTEST1);
 8 #elif
 9     printf("ifdef: not defined!\n");
10 #endif
11     return 0;
12 }

編譯出錯:

 

2、#if說明:#if指令更像常規的C中的if,#if后跟常量整數表達式。如果表達式為非零值,則表達式為真。在該表達式中可以使用C的關系運算符和邏輯運算符。且可以使用#elif指令擴展if-else序列(C Primer Plus中文版(第五版) 人民郵電出版社 P462)

總結出來的點為:

1)#if是要判斷它后面表達式真假的,是真才執行#if后的代碼;

2)#if和#elif搭配使用,這就可以用多種條件編譯選擇;

3)#if也是必須要以#endif配合使用。

示例說明:

 1 #define IFTEST1        0
 2 #define IFTEST2        1
 3 
 4 int main()
 5 {
 6 #if IFTEST1         //為假,不執行
 7     printf("if : %d\n", IFTEST1);
 8 #elif IFTEST2       //為真,執行
 9     printf("if : %d!\n", IFTEST2);
10 #else
11     printf("if : not true!\n");
12 #endif
13     return 0;
14 }

 


免責聲明!

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



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