![](/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.