顯而易見的答案是:不要寫#include <Helper.h>
。您的 文件不是實施的一部分,應該包含 使用。如果這樣做,編譯器會尋找包含文件的第一個目錄 位於目錄 中,該目錄包含包含它的文件:如果從Foo/Foo.h
包含它 ,則編譯器將選取Foo/Helper.h
;如果從Bar/Bar.h
中包含 ,則編譯器將選取Bar/Helper'
和 等。
客戶端代碼應該只設置包含路徑的根目錄,並執行#include "Foo/Foo.h"
;如果有必要,他們也可以 做#include "Foo/Helper.h"
。
你必須要做的一件事就是確保 所有標頭警衛的唯一性。如果這是一個 申請,通常將足夠的路徑 劃分到包含保護中,例如,使用Foo_Helper_h
,而不僅僅是 Foo_h
。或者(我會用這個任何第三方應該使用的庫 ),爲包含後衛的 生成一些隨機字符串。 (如果我打開一個名爲abc.h
文件,該文件 不存在,我的編輯器會自動生成以下 樣板:
/********************************************************/
/* File: abc.h */
/* Author: J. Kanze */
/* Date: 02/05/2013 */
/* ---------------------------------------------------- */
#ifndef abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#define abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#endif
這是一個安全的賭注,將包括在這裏守護將永遠不會發生衝突 與其他任何(與你要做的東西沿着這些路線 反正,爲了在該文件中,讓您的版權信息)
是的,不要將'Foo','Bar'或'Helper'添加到包含路徑中,並且包含'Foo/Helper.h'和'Bar/Helper.h'。或者提出比'Helper.h'更好的名字。 – juanchopanza 2013-05-02 16:31:58
@juanchopanza'Helper.h'只是一個佔位符名稱,你可以把它看作'Fat16.h'或類似的東西。你能詳細說明一下,並將其作爲答案嗎?這裏很難理解。 – 2013-05-02 16:37:31