1. 程式人生 > >關於C/C++標頭檔案重複定義的思考

關於C/C++標頭檔案重複定義的思考

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"中所有的內容。