Arduino库中包含文件的冲突

Conflict of include files from an Arduino library

本文关键字:冲突 文件 包含 Arduino      更新时间:2023-10-16

我正在编写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.hFoo隐藏起来,将Bar从草图隐藏起来?

显而易见的答案是:不要写#include <Helper.h>。你的文件不是实现的一部分,应该包括在内使用CCD_ 6。如果你这样做,首先编译器将在目录中查找包含文件包含包含它的文件:如果包含它从Foo/Foo.h,编译器将拾取Foo/Helper.h;如果包括则编译器将从Bar/Bar.h中获取Bar/Helper'等等。

客户端代码应该只设置根的include路径像#include "Foo/Foo.h";如果必要,他们也可以执行CCD_ 12。

你必须做的一件事就是确保所有收割台防护装置的唯一性。如果这是应用程序,通常只要破坏路径就足够了进入包含保护,例如使用Foo_Helper_h,而不是仅Foo_h。或者(我会把它用于任何图书馆第三方应该使用的(,生成一些随机字符串include guard。(如果我打开一个名为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

这样,FooBar中的Helper.h对客户端是不可见的,并且我可以分别在FooBar中写入#include "extra/Helper.h"以包括所需的文件。