冲突包括一个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”。

有没有办法从FooBar中从草图中隐藏Helper.h

+2

是的,不要将'Foo','Bar'或'Helper'添加到包含路径中,并且包含'Foo/Helper.h'和'Bar/Helper.h'。或者提出比'Helper.h'更好的名字。 – juanchopanza 2013-05-02 16:31:58

+0

@juanchopanza'Helper.h'只是一个占位符名称,你可以把它看作'Fat16.h'或类似的东西。你能详细说明一下,并将其作为答案吗?这里很难理解。 – 2013-05-02 16:37:31

显而易见的答案是:不要写#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.hFooBar将是不可见的客户,我可以分别写在Foo#include "extra/Helper.h"Bar包括所需的文件。