編譯器支援(標準未定義);
由編譯器保證不會重複包含物理上的同乙個檔案
#ifndef __test.h__
#define __test.h__
//code
#endif
條件編譯是標準支援的(因為標準支援#define定義的識別符號);
不會重複引入同名的檔案(存在不小心寫錯define識別符號導致重複引入的問題)
所以有些c標準庫里同時採用了這兩種方式,可能是為了兼併其優點吧。
用前置宣告取代包含標頭檔案:
如下例子:
定義乙個類 class a,這個類裡面使用了類b的物件b,然後定義了乙個類b,裡面也包含了乙個類a的物件a,就成了這樣:
#include "b.h"
class a
;
#include "a.h"
class b
;
一編譯,就出現了乙個互包含的問題了,這時就有人跳出來說,這個問題的解決辦法可以這樣,在a.h檔案中宣告類b,然後使用b的指標。
//#include "b.h"
class b;
class a
;
#include "a.h"
class b
;
因為指標(或者引用)的大小是確定的,無需預先知道所指向類的大小,這時只需存在該類的不完整宣告便可以宣告指向該類物件的指標(或引用),藉此避免了在a類和b類的定義檔案中包含標頭檔案的方式。只是真正用到這兩個類的時候,需要在用到的地方包含這兩個標頭檔案。
防止標頭檔案重複包含
在程式設計中,經常會遇到這種情況,我們的某乙個程式會呼叫多個dll,因此需要包含多個標頭檔案,不同的標頭檔案可能包含了相同某乙個下一級標頭檔案,這就可能會導致標頭檔案的重複包含,從而導致變數 函式的重定義等等,為了解決這個問題,就要求我們在編寫dll的時候,使用 ifndef define endi...
防止標頭檔案的重複包含
防止標頭檔案重複包含的巨集想必大家都清楚,ifndef define endif就是幹這個用的,面試中也考過。我也是知道這個巨集的作用,今天我們就來實戰測試一下,網上說的那是別人的東西,只有自己測試過出結果的才是自己的東西。localhost test ls a.h test.c test.h lo...
C 防止標頭檔案重複包含
1.預編譯階段,把所有 include h 用.h的內容來替換了,所以之後就沒有.h了所有.h的內容都已經包含進了需要它們的.cpp中 2.生成最後的exe檔案是由編譯 鏈結兩步完成的,編譯是源 生成obj二進位制目標檔案的過程,注意乙個源 檔案生成乙個obj檔案,例如a.cpp中可以有乙個void...