16

私のフォルダ構造は

libA
    x.h
    y.h
    algorithm/
        a.h

今、a.h私は#include "libA/x.h"どちらが機能していません。を探していalgorithm/libA/x.hます。だから私は使用する必要があります#include "../x.h"か?2番目のオプションは悪い設計ですか? 現在 libA はヘッダーのみです。しかし後者では、ライブラリとしてコンパイルすることを選択するかもしれません

私はcmakeを使用していますのでlibA、インクルードパスに追加できますか、または追加する必要がありますか?

要するに

My algorithm ディレクトリ内の一部のファイルには、その親フォルダからの定義を含める必要があります。型が明白でやり過ぎになるため、すべての関数をテンプレート化することはできません。では、どのように私のプロジェクトを設計すればよいでしょうか?

4

3 に答える 3

8

あなたのソリューション#include "../x.h"はうまくいきます。これが悪い設計かどうかについては、おそらくそうです。コードについて詳しく知らなければわかりません。

多くのインクルード パスがある場合、コンパイラ/プリプロセッサは../x.hそれらすべてを検索するという事実を考慮してください。これは、意図せず広すぎる可能性があります。

次のディレクトリ構造があり、Your_Codeインクルード ファイルの検索パスにあるとします。

Unrelated_Directory/
    x.h - unrelated
    Your_Code/
        libA/
            x.h - the real one
            algorithm/
                a.h

これは危険です。real を削除/名前変更するx.hと、コンパイラは無関係なものを含む を静かに選択Your_Code/../x.hします - これは不可解なエラーメッセージにつながる可能性があります。さらに悪いことに、これはバグだらけの古いバージョンかもしれません!

于 2013-02-27T21:00:36.340 に答える
2

他のプロジェクトで使用することがわかっているライブラリを作成するときは、boost の包含スタイルを使用する傾向があります。

#include <libA/x.h>

これは、"libA" の上のフォルダー (おそらく/include) が存在する限り、"libA" を使用して、その下にあるすべてのものを参照できることを意味します。また、boost スタイルのものをインクルードするときに、類似した名前のインクルージョン ファイルの衝突を回避するのにも役立ちます。これは、ライブラリ内およびライブラリのヘッダーやその他の関連コードの外側で、常に "xh" をプルするライブラリを指定しているためです。例えば

#include <SexyLib/x.h> // Two different x.h
#include <TheLibFarAway/x.h>  // but same name! I hope you also have Namespaces :D

これは個人的な好みにすぎませんが、私が開発しているライブラリでもboostうまくいくようです。それが役立つことを願っています!

于 2013-02-27T20:13:37.760 に答える
1

gcc を使用している場合は、-IPathTo/libA を追加して libA をフォルダーのリストに追加し、#include "xh" を使用できます。

于 2013-02-27T19:38:17.823 に答える