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非表示Fooにする方法はありますか?Bar

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"

この戦略で行う必要がある 1 つのことは、すべてのヘッダー ガードの一意性を確保することです。これがアプリケーションの場合、パスをインクルード ガードに変更するだけで通常は十分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.hinFooBarはクライアントには見えず、 と にそれぞれ書き込み、#include "extra/Helper.h"目的のファイルを含めることができます。FooBar

于 2013-05-02T16:51:22.263 に答える