關於C/C++標頭檔案重複定義的思考
阿新 • • 發佈:2019-02-13
1.什麼叫重複定義
我們在寫大型專案的時候,檔案多,關係複雜。往往會引起標頭檔案重複定義的問題。
什麼叫標頭檔案重複定義呢?
舉個最簡單的例子:
有一個頭檔案"c.h",在"a.h"中存在兩次對"c.h"標頭檔案的引用。在"a.h"中有如下語句:
<span style="font-size:18px;">#include "c.h"
#include "c.h"</span>
出現這樣的幼稚的錯誤可能有兩種原因,第一種就是你不小心手一抖將"ch.h"少些了。或者是你只是好奇,寫了兩個。第二種是最不容易察覺到的,就是在呼叫其他標頭檔案中重複呼叫了"c.h"。工程中呼叫錯綜複雜,不小心呼叫了兩次是很容易發生的。
如"b.h"的標頭檔案中有:
#include "c.h"
"a.h"同時引用了"c.h"和"b.h"即:
#include "b.h"
#include "c.h"
2.如何解決重複定義
解決重複第一個的一個好辦法是每一個頭檔案前都加入#ifndef #define...#endif的巨集定義。如標頭檔案"c.h"寫成如下形式。
#ifndef C_H
#define C_H
/*
c.h中所有內容,!注意這裡是所有內容
*/
#endif</span>
3. 為什麼能解決重複定義的問題?
為什麼這樣做能解決重複引用的問題呢?比如上面舉的第二種情況的例子,“a.h”首先引用"b.h","b.h"中呼叫”c.h“。第一次沒有定義C_H的巨集,引用"c.h"成功。第二次引用"c.h"時,由於已經定義了C_H,將不再會引用"c.h"。這樣就很好的解決了重複引用的問題。
!注意1 有養成習慣每一個頭檔案都加這樣一個巨集定義。
!注意2 巨集定義#define C_H下面的內容是原來的"c.h"中所有的內容。