在 stm32 標準庫的所有標頭檔案以及我們自己編寫的「bsp_led.h」標頭檔案中,可看到類
似**清單 12-9 的巨集定義。它的功能是防止標頭檔案被重複包含,避免引起編譯錯誤。
**清單 12-9 防止標頭檔案重複包含的巨集
1 #ifndef __led_h
2 #define __led_h
3 4 /*此處省略標頭檔案的具體內容*/
5 6 #endif /* end of __led_h */
在標頭檔案的開頭,使用「#ifndef」關鍵字,判斷標號「__led_h」是否被定義,若沒 有被定義,則從「#ifndef」至「#endif」關鍵字之間的內容都有效,也就是說,這個標頭檔案 若被其它檔案「#include」,它就會被包含到其該檔案中了,且標頭檔案中緊接著使用 「#define」關鍵字定義上面判斷的標號「__led_h」。當這個標頭檔案被同乙個檔案第二次 「#include」包含的時候,由於有了第一次包含中的「#define __led_h」定義,這時再判 斷「#ifndef __led_h」,判斷的結果就是假了,從「#ifndef」至「#endif」之間的內容都 無效,從而防止了同乙個標頭檔案被包含多次,編譯時就不會出現「redefine(重複定義)」 的錯誤了。 一般來說,我們不會直接在 c 的原始檔寫兩個「#include」來包含同乙個標頭檔案,但 可能因為標頭檔案內部的包含導致重複,這種**主要是避免這樣的問題。如「bsp_led.h」 檔案中使用了「#include ―stm32f10x.h‖ 」語句,按習慣,可能我們寫主程式的時候會在 main檔案寫「#include ―bsp_led.h‖ 及#include ―stm32f10x.h‖」,這個時候「stm32f10x.h」文 件就被包含兩次了,如果沒有這種機制,就會出錯。 至於為什麼要用兩個下劃線來定義「__led_h」標號,其實這只是防止它與其它普通 巨集定義重複了,如我們用「gpio_pin_0」來代替這個判斷標號,就會因為 stm32f10x.h 已 經定義了 gpio_pin_0,結果導致「bsp_led.h」檔案無效了,「bsp_led.h」檔案一次都沒被 包含。 防止標頭檔案重複包含
在程式設計中,經常會遇到這種情況,我們的某乙個程式會呼叫多個dll,因此需要包含多個標頭檔案,不同的標頭檔案可能包含了相同某乙個下一級標頭檔案,這就可能會導致標頭檔案的重複包含,從而導致變數 函式的重定義等等,為了解決這個問題,就要求我們在編寫dll的時候,使用 ifndef define endi...
防止標頭檔案重複包含方法
編譯器支援 標準未定義 由編譯器保證不會重複包含物理上的同乙個檔案 ifndef test.h define test.h code endif 條件編譯是標準支援的 因為標準支援 define定義的識別符號 不會重複引入同名的檔案 存在不小心寫錯define識別符號導致重複引入的問題 所以有些c標...
防止標頭檔案的重複包含
防止標頭檔案重複包含的巨集想必大家都清楚,ifndef define endif就是幹這個用的,面試中也考過。我也是知道這個巨集的作用,今天我們就來實戰測試一下,網上說的那是別人的東西,只有自己測試過出結果的才是自己的東西。localhost test ls a.h test.c test.h lo...