明白な答えは: 書かないでください#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
ここでのインクルード ガードが他のガードと競合しないことは間違いありません。(そして、あなたの著作権メッセージをファイルに入れるために、とにかくこれらの行に沿って何かをしなければなりません.)