if和 ifdef的區別

2022-08-11 08:48:11 字數 1459 閱讀 8396

學習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配合使用;

示例說明:

5編譯出錯:

2、#if說明:#if指令更像常規的c中的if,#if後跟常量整數表示式。如果表示式為非零值,則表示式為真。在該表示式中可以使用c的關係運算子和邏輯運算子。且可以使用#elif指令擴充套件if-else序列(c primer plus中文版(第五版) 人民郵電出版社 p462)

總結出來的點為:

1)#if是要判斷它後面表示式真假的,是真才執行#if後的**;

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

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

示例說明:

if和 ifdef的區別

學習stm32偶然發現 在keil中直接預先定義巨集use stdperiph driver,但是卻沒有指定巨集的值。而在標頭檔案中判斷用的是如下 1 ifdef use stdperiph driver 2 include stm32f4xx conf.h 3 endif use stdperip...

ifdef和 if的區別

1 ifdef只是判斷後面的識別符號有沒有定義,而不在乎識別符號的值,識別符號是0是1對它來說都沒有區別,只要預先定義了,執行 ifdef後的 2 ifdef是和 else搭配使用的,沒有 elif搭配之說 3 ifdef必須要有 endif配合使用 define iftest1 0 define ...

ifdef 和 pragma once 的區別

方式1 ifdef heat name define heat name endif 方式2 pragma once 正文 方式1用來防止某個巨集被多次定義。方式2是c 語言中的巨集定義,通過巨集定義避免檔案多次編譯,需要編譯平台的支援。他依賴巨集的名字不能重複,這不光保證同一檔案不會被包含多次,也...