![](/img/trans.png)
[英]Is it possible to include a library from another library using the Arduino IDE?
[英]Conflict of include files from an Arduino library
我正在編寫Arduino庫,文件夾結構如下:
libraries
+Foo
-Foo.h
-Helper.h
+Bar
-Bar.h
-Helper.h
+Helper
-Helper.h
Foo和Bar是我創建的庫。 將Helper.h放在其文件夾中的原因是,最終用戶將更輕松地使庫開始工作。 另外,某些庫只能通過編輯其源代碼來進行配置。
但是,如果我在草圖中編寫#include <Helper.h>
,將無法控制要包括的“ Helper.h”。
有沒有辦法從草圖中隱藏Foo
和Bar
Helper.h
?
顯而易見的答案是:不要編寫#include <Helper.h>
。 您的文件不是實現的一部分,應使用#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_Helper_h
而不是Foo_h
。 或者(我將把它用於第三方應使用的任何庫),為include保護生成一些隨機字符串。 (如果打開了一個不存在的名為abc.h
的文件,我的編輯器會自動生成以下樣板:
/********************************************************/
/* File: abc.h */
/* Author: J. Kanze */
/* Date: 02/05/2013 */
/* ---------------------------------------------------- */
#ifndef abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#define abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#endif
可以肯定的是,這里的include防護不會與其他任何沖突。 (而且無論如何,您都必須按照這些原則做一些事情,以便在文件中獲得版權信息。)
只是想出了一種看似可以解決問題的方法:
libraries
+Foo
-Foo.h
+extra
-Helper.h
+Bar
-Bar.h
+extra
-Helper.h
+Helper
-Helper.h
這樣, Foo
和Bar
Helper.h
對客戶端是不可見的,我可以在Foo
和Bar
分別編寫#include "extra/Helper.h"
以包括所需的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.