學習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 }