防止標頭檔案二次編譯

2021-07-10 11:48:14 字數 2102 閱讀 4903

一、下劃線「__」屬於程式設計風格的內容,對程式沒有影響。不用下劃線也可以,用幾個下劃線也由個人習慣。

二、其實質是乙個巨集名。由此我們可以防止發生重複定義或宣告。

假設你的頭檔名為head.h,根據習慣,我們宣告乙個巨集head_h,對應這個標頭檔案,在標頭檔案中開始的地方和結尾的地方加上   對head_h的宣告和判斷,標頭檔案head.h如下: 

#ifndef   head_h 

#define   head_h 

……(標頭檔案內容) 

#endif 

這樣,標頭檔案可以避免被多次包含。標頭檔案中定義的變數不存在重複宣告或定義。

一、關鍵字:

#ifndef

,#define

,#endif

可以防止標頭檔案被重複引用

結構是這樣的:

如a.h

標頭檔案#ifndef xx

#define xx

// 函式宣告

#endif

第一次include這個標頭檔案的時候由於xx還沒有被define,所以滿足#ifndef xx這個判斷

那麼執行它下面的內容 #define xx和他下面的函式宣告;

如果由於編碼者的不小心或者巢狀包含造成了這個標頭檔案被多次引用;那麼當編譯到第二次#inlude的地方的時候由於不滿足 #ifndef xx這個判斷條件所以不執行後面的內容(#define xx和函式宣告都不走)直接跳到#endif因此可以很好的防止標頭檔案被重複引用

二、現在有乙個大型的程式分為很多模組

每個模組中又有很多的函式

這樣你肯定不可能知道他的全部函式中的**

現在假如說

main.c檔案中有這們兩行**:

#include

#include

而macro.h有:

#include

現在可以發現我們在main和macro中重複引用了key.h這樣乙個標頭檔案

這就叫重複引用

防止重複引用的方法就是在每個標頭檔案中加上ifndef/define/endif條件編譯語句

標頭檔案重複引用是指乙個標頭檔案在同乙個cpp檔案中被include了多次,這種錯誤常常是由於include 巢狀造成的。比如:

存在a.h檔案

#include "dup.h"

.....

b.cpp檔案如下

#include "a.h"

#include "dup.h"

....

此時就會造成重複引用。解決方法是在dup.h開頭中加上:

#ifndef dup_h

#define dup_h

.......  //原來dup.h中的內容

#endif

三、#include

檔案的乙個不利之處在於乙個標頭檔案可能會被多次包含,為了說明這種錯誤,考慮下面的**

:#include "x.h"

#include "x.h"

顯然,這裡檔案

x.h被包含了兩次,沒有人會故意編寫這樣的**。但是下面的**

:#include "a.h"

#include "b.h"

看上去沒什麼問題。如果

a.h和

b.h都包含了乙個標頭檔案

x.h。那麼

x.h在此也同樣被包含了兩次,只不過它的形式不是那麼明顯而已。

多重包含在絕大多數情況下出現在大型程式中,它往往需要使用很多標頭檔案,因此要發現重複包含並不容易。要解決這個問題,我們可以使用條件編譯。如果所有的標頭檔案都像下面這樣編寫

:#ifndef _headername_h

#define _headername_h

...#endif

那麼多重包含的危險就被消除了。當頭檔案第一次被包含時,它被正常處理,符號

_headername_h

被定義為

1。如果標頭檔案被再次包含,通過條件編譯,它的內容被忽略。符號

_headername_h

按照被包含標頭檔案的檔名進行取名,以避免由於其他標頭檔案使用相同的符號而引起的衝突。

但是,你必須記住預處理器仍將整個標頭檔案讀入,即使這個標頭檔案所有內容將被忽略。由於這種處理將減慢編譯速度,所以如果可能,應該避免出現多重包含

兩種防止標頭檔案二次編譯的方法

ifndef是最早期使用的方法,是基於語言的巨集定義名字不能衝突的前提下的。優點 這種方法不僅能保證同乙個標頭檔案不會被包含兩次,也可以保證內容完全相同的兩個檔案也只能被包含一次。缺點 你的 ifndef 後面跟的巨集名字和你程式中的其他巨集名字發生了 撞車 那麼會出現嚴重後果 例子 file1.h...

防止標頭檔案二次編譯的兩種方法

1 ifndef ifndef是最早期使用的方法,是基於語言的巨集定義名字不能衝突的前提下的。優點 這種方法不僅能保證同乙個標頭檔案不會被包含兩次,也可以保證內容完全相同的兩個檔案也只能被包含一次。缺點 你的 ifndef 後面跟的巨集名字和你程式中的其他巨集名字發生了 撞車 那麼會出現嚴重後果 例...

Android APP如何防止二次打包

要實現 內部防止 被二次打包首先得了解 apk的機器識別原理,apk的唯一識別是依靠包名和簽名來做鑑定的 類似豌豆夾的洗白白 360手機衛士等安全軟體對 apk的山寨識別,他們就是依賴包名來確定 apk,然後通過簽名來確定其是否山寨。所以說自己的程式內部在啟動的時候可以通過獲取 apk本身的簽名然後...