學習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
34 int main()
5 複製**
2)複製**
1 //#define iftest1 0
2 #define iftest2 1
34 int main()
5 複製**
編譯出錯:
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
34 int main()
5 深圳**建設
ifdef和 if的區別
1 ifdef只是判斷後面的識別符號有沒有定義,而不在乎識別符號的值,識別符號是0是1對它來說都沒有區別,只要預先定義了,執行 ifdef後的 2 ifdef是和 else搭配使用的,沒有 elif搭配之說 3 ifdef必須要有 endif配合使用 define iftest1 0 define ...
if和 ifdef的區別
學習stm32偶然發現 在keil中直接預先定義巨集use stdperiph driver,但是卻沒有指定巨集的值。而在標頭檔案中判斷用的是如下 1 ifdef use stdperiph driver 2 include stm32f4xx conf.h 3 endif use stdperip...
ifdef 和 pragma once 的區別
方式1 ifdef heat name define heat name endif 方式2 pragma once 正文 方式1用來防止某個巨集被多次定義。方式2是c 語言中的巨集定義,通過巨集定義避免檔案多次編譯,需要編譯平台的支援。他依賴巨集的名字不能重複,這不光保證同一檔案不會被包含多次,也...