17

私のプロジェクトでは、現在相対パスを使用してファイルを含めていますが、これは頻繁に変更されることはありません。ただし、通常はファイルを多数のフォルダーにネストしているため、非常に奇妙なインクルード パターンが生成されます。

たとえば、現在のプロジェクトではnetwork/server/myfile.hpp. を含める必要がありますcommon/log.hpp。現在私が使用#include "../../common/log.hpp"しているものはかなり冗長ですが、機能します。

代わりにメインのインクルード ディレクトリをパスに追加すると、単にインクルードできます"common/log.hpp"

この質問は何よりも好みに関するものかもしれませんが、クロスプラットフォームアプリケーションに関して客観的な長所と短所はありますか?また、C++ の規則はどうですか?

4

5 に答える 5

12

相対インクルード パスは..少し見苦しく、特定のファイル システム構造、つまり"../../common/log.hpp"2 つのフォルダーを想定しています。ヘッダー ファイルをあるディレクトリから別のディレクトリに移動しても、そのヘッダーを含むすべてのソース ファイルを更新する必要がないように、一般的に、特にファイル システム構造に対する不要な依存関係を避けることは理にかなっています。

インクルードを名前空間とクラスに対応させることもエレガントです。たとえば、次のような場合:

namespace foo { namespace bar { struct Baz; } }

次のように含めると便利で直感的です。

#include "foo/bar/Baz.h"
于 2011-02-15T17:11:35.967 に答える
5

#include <common/log.hpp>ソースファイルにパスを入れ、プロジェクト設定 (コンパイラオプション) にパスを入れることで、他の場所に移動しcommon/log.hppた場合にソースコードを変更から保護できるので、このアプローチをお勧めします。common/log.hppこの場合、山括弧を使用することに注意してください。コンパイラは、/Iコンパイラ オプションで指定されたパスのディレクトリでヘッダーを検索する必要があります。

于 2011-02-15T17:09:27.640 に答える
2

私は常に自分のプロジェクトを場所に依存しないように努めています。新しいコンピューター/プラットフォームで作業する場合、最低限必要なセットアップでコンパイルして作業を続けられるようにしたいと考えています。あなたが主観的な質問をしているので、私の主観的な答えは、絶対に相対パスを使用することを好むということです。

于 2011-02-15T17:01:57.780 に答える
1

規約自体はありません。どちらの方法でも、お好みの方法で行うことができます。

つまり、きちんとした状態に保ちたい場合は、明らかに2番目のオプションを選択します.2番目のオプションを選択します。なぜなら、ボルダーを移動する必要があるのではなく、いくつかのファイルだけを移動する必要があるからです。

さらに、相対パスを使用すると、アプリケーションを移植する自由が得られるため、そのまま実行してください:)

于 2011-02-15T17:02:08.047 に答える
0

個々のコンポーネントごとに複数のディレクトリを使用してはならないという規則があり、そのコンポーネントにはインクルード パスに依存するコンポーネントのディレクトリがあります。

したがって、各コンポーネントは独自の""構文でインクルード ファイルを使用し、他のコンポーネントは using をインクルードします<>。これにより、1 つのコンポーネントがヘッダーを使用して、システムに最後にデプロイされたバージョンがソース ツリーのインクルード ディレクトリではなくディレクトリをインクルードするという不愉快な驚きをうまく回避できます。 ; また、早い段階でプロジェクトをコンポーネント化せざるを得なくなるという素晴らしい効果もあります。

于 2011-02-15T17:18:06.587 に答える