冲突包括一个Arduino库
文件我写的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”。
有没有办法从Foo
和Bar
中从草图中隐藏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_h
。或者(我会用这个任何第三方应该使用的库 ),为包含后卫的 生成一些随机字符串。 (如果我打开一个名为abc.h
文件,该文件 不存在,我的编辑器会自动生成以下 样板:
/********************************************************/
/* File: abc.h */
/* Author: J. Kanze */
/* Date: 02/05/2013 */
/* ---------------------------------------------------- */
#ifndef abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#define abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#endif
这是一个安全的赌注,将包括在这里守护将永远不会发生冲突 与其他任何(与你要做的东西沿着这些路线 反正,为了在该文件中,让您的版权信息)
就想通了,看似解决问题的方式:
libraries
+Foo
-Foo.h
+extra
-Helper.h
+Bar
-Bar.h
+extra
-Helper.h
+Helper
-Helper.h
这样,Helper.h
在Foo
和Bar
将是不可见的客户,我可以分别写在Foo
#include "extra/Helper.h"
和Bar
包括所需的文件。
是的,不要将'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