我正在编写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”。
有没有办法隐藏Helper.h
和Foo
草图中的Bar
?
答案 0 :(得分:1)
显而易见的答案是:不要写#include <Helper.h>
。您的
文件不是实现的一部分,应该包含在内
使用#include "Helper.h"
。如果你这样做,首先
编译器会在目录中查找包含文件
包含包含它的文件:如果包含它
从Foo/Foo.h
开始,编译器将选择Foo/Helper.h
;如果你包括
它来自Bar/Bar.h
,编译器会选择Bar/Helper'
和
等等。
客户端代码应该只设置root的包含路径,并且可以
像#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
这是一个安全的赌注,这里的包含守卫永远不会发生冲突 与任何其他。 (而且你必须按照这些方针做点什么 无论如何,为了在文件中获取您的版权信息。)
答案 1 :(得分:0)
刚刚找到了解决问题的方法:
libraries
+Foo
-Foo.h
+extra
-Helper.h
+Bar
-Bar.h
+extra
-Helper.h
+Helper
-Helper.h
通过这种方式,Helper.h
和Foo
中的Bar
对客户端不可见,我可以在#include "extra/Helper.h"
和{{1}中写Foo
分别包含所需的文件。