0

我正在编写 Arduino 库,文件夹结构如下:

libraries   
  +Foo
    -Foo.h
    -Helper.h   
  +Bar
    -Bar.h
    -Helper.h   
  +Helper
    -Helper.h

Foo 和 Bar 是我创建的库。将 Helper.h 放在他们的文件夹中的原因是,最终用户将更容易让这些库工作。此外,某些库只能通过编辑其源代码来配置。

但是,如果我写#include <Helper.h>在我的草图中,将无法控制我包含哪个“Helper.h”。

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

4

2 回答 2

1

显而易见的答案是:不要写#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_h。或者(我会将它用于第三方应该使用的任何库),为包含防护生成一些随机字符串。(如果我打开一个名为abc.h但不存在的文件,我的编辑器会自动生成以下样板:

/********************************************************/
/*      File:       abc.h                               */
/*      Author:     J. Kanze                            */
/*      Date:       02/05/2013                          */
/* ---------------------------------------------------- */

#ifndef abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9
#define abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9

#endif

可以肯定的是,这里的包含守卫永远不会与任何其他守卫发生冲突。(无论如何,您都必须按照这些方式做一些事情,以便在文件中获取您的版权信息。)

于 2013-05-02T16:44:50.030 回答
0

刚刚想出了一个看似解决问题的方法:

libraries   
  +Foo
    -Foo.h
    +extra
      -Helper.h   
  +Bar
    -Bar.h
    +extra
      -Helper.h   
  +Helper
    -Helper.h

这样,Helper.hin Fooand对客户来说是不可见的,Bar我可以分别写入#include "extra/Helper.h"和包含所需的文件。FooBar

于 2013-05-02T16:51:22.263 回答