来自Arduino库的包含文件的冲突

时间:2013-05-02 16:29:08

标签: c++ 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”。

有没有办法隐藏Helper.hFoo草图中的Bar

2 个答案:

答案 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.hFoo中的Bar对客户端不可见,我可以在#include "extra/Helper.h"和{{1}中写Foo分别包含所需的文件。