3

C++ ライブラリを開発しています。ライブラリのさまざまなコンポーネントを含めて、Java と C# が処理する方法について考えさせられました。たとえば、Java は「インポート」を使用して他のパッケージのクラスを使用できるようにしますが、C# は単純に「使用」を使用してモジュール全体をインポートします。

私の質問は、ライブラリ内のすべてを 1 つの大規模なインクルードに #include し、using ディレクティブを使用して特定のクラスとモジュールをインポートするのは良い考えでしょうか? それとも、これはただクレイジーになるのでしょうか?

編集: これまでのところ良い反応です。ここに、この考えに追加されると私が感じるいくつかの緩和要因があります:

1)内部の #includes は通常どおりに保持されます (短く要点を示します)
2)すべてを含むファイルは、必要に応じてライブラリと共に提供され、使用したい人に提供されます
3)オプションで、大きなインクルード ファイルを pre -コンパイル済みヘッダー

4

5 に答える 5

5

#includeC++のステートメントの目的を混乱させています。Java の import ステートメントや C# の using ステートメントとは異なります。#includeそれが言うことをします。つまり、指定されたファイル全体を現在の翻訳単位の一部として読み込んで解析します。個別のインクルードの理由は、すべてのファイルの標準ライブラリ全体を解析するためにコンパイル時間を費やす必要がないためです。対照的に、あなたが動作させようとしているステートメントは、#include単にプログラマーを編成するためのものです。

#includeコンパイルプロセスの管理用です。分別用ではありません。(実際、個別のヘッダーを使用して個別の使用を強制することはできません。これを行うと、1 つの定義規則に違反するためです)

tl;dr -> いいえ、そうすべきではありません。#include出来るだけ少なく。プロジェクトが大きくなると、プロジェクトのコンパイルに何時間も待たされないことに感謝するでしょう。

于 2011-03-01T05:24:29.263 に答える
2

個人的には、ファイルに必要な機能を明示的に示す必要がある場合にのみヘッダーを含めることをお勧めします。同時に、これを行うと、ファイルの目的に関係のない機能など、必ずしも必要ではない機能にアクセスできなくなります。確かに、これは大したことではありませんが、不要な関数/クラスにアクセスできない場合は、コードの保守と変更が容易になると思います。それはそれをより簡単にするだけです。

于 2011-03-01T05:15:15.347 に答える
1

私はこれに反対票を投じるかもしれませんが、あなたは興味深いアイデアを思いついたと思います。おそらくコンパイルが少し遅くなるでしょうが、コンセプトはきちんとしていると思います。

控えめに (必要な名前空間だけに)使用している限り、using他の開発者はファイルの上部を一瞥するだけで、ファイル内でどのクラスが使用されているかを知ることができます。d ファイルのリストを表示するほど詳細ではありませんが、#includeインクルードされたヘッダー ファイルのリストを表示することは本当に便利ですか? 私はそうは思わない。

もちろん、すべてのヘッダーファイルがすべて包含ガードを使用していることを確認してください。:)

于 2011-03-01T05:19:37.247 に答える
0

I think it will be confusing. When you write C++ you should avoid making it look like Java or C# (or C :-). I for one would really wonder why you did that.

Supplying an include-all file isn't really that helpful either, as a user could easily create one herself, with the parts of the library actually used. Could then be added to a precompiled header, if one is used.

于 2011-03-01T18:38:19.133 に答える
0

@Billy ONeal が言ったように、主なことは、#include がコンパイル時間の増加につながるコードの「^C、^V」(コピーアンドペースト) を引き起こすプリプロセッサディレクティブであるということです。

C++ で最もよく考えられるポリシーは、".h" ファイルですべての可能なクラスを前方宣言し、".cpp" ファイルに含めることです。依存するインクルード ファイルが変更されると、C/C++ プロジェクトがカスケード的に再構築されるため、依存関係が分離されます。

もちろん、M $ コンパイラとそのプリコンパイル済みヘッダーは、反対のことを行う傾向があり、提案した内容を囲みます。しかし、これらのコンパイラ間でコードを移植しようとした人なら誰でも、それがどれほど臭いものになるかをよく知っています。

Qt などの一部のライブラリは、前方宣言を広範囲に使用します。気になる味をチェックしてみてくださいね。

于 2011-03-01T17:51:43.630 に答える