2013-05-02 74 views
0

文件我寫的Arduino庫和具有文件夾結構如下:衝突包括一個Arduino庫

libraries 
    +Foo 
    -Foo.h 
    -Helper.h 
    +Bar 
    -Bar.h 
    -Helper.h 
    +Helper 
    -Helper.h 

Foo和Bar是我創造的庫。把Helper.h放在他們的文件夾中的原因是,最終用戶可以更容易地讓庫工作。此外,某些庫只能通過編輯源代碼進行配置。

但是,如果我在我的sketch中編寫#include <Helper.h>,將無法控制包含哪個「Helper.h」。

有沒有辦法從FooBar中從草圖中隱藏Helper.h

+2

是的,不要將'Foo','Bar'或'Helper'添加到包含路徑中,並且包含'Foo/Helper.h'和'Bar/Helper.h'。或者提出比'Helper.h'更好的名字。 – juanchopanza 2013-05-02 16:31:58

+0

@juanchopanza'Helper.h'只是一個佔位符名稱,你可以把它看作'Fat16.h'或類似的東西。你能詳細說明一下,並將其作爲答案嗎?這裏很難理解。 – 2013-05-02 16:37:31

回答

1

顯而易見的答案是:不要寫#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 

這是一個安全的賭注,將包括在這裏守護將永遠不會發生衝突 與其他任何(與你要做的東西沿着這些路線 反正,爲了在該文件中,讓您的版權信息)

0

就想通了,看似解決問題的方式:

libraries 
    +Foo 
    -Foo.h 
    +extra 
     -Helper.h 
    +Bar 
    -Bar.h 
    +extra 
     -Helper.h 
    +Helper 
    -Helper.h 

這樣,Helper.hFooBar將是不可見的客戶,我可以分別寫在Foo#include "extra/Helper.h"Bar包括所需的文件。