1

ヘッダー ファイルに STL をインクルードするのは悪い考えですか、それとも良い考えですか? ここで、それらを独自に定義したクラスのメンバー変数として使用します。

私の推測では、作成したライブラリが C++ 標準ライブラリから完全に独立していることを本当に望んでいる人がいるということです。そのため、C++ STL で利用可能な機能と同様の型を再度書き直すことを余儀なくされますが、他の人は後で必要になる型をヘッダー ファイルで前方宣言しようとします。他の人はこれを悪い習慣と見なし、まったく良い考えではありません。

私が間違っている場合は修正してください(私はあまり知らないので、すべてが単なる仮定です):

  1. vectorそれで、STLで利用可能な型を前方宣言するときのコードの移植性の観点からの影響は何ですか(コードをプラットフォームに依存しないことを本当に望んでいた人にとって)?常に動作することが保証されています)。

  2. ヘッダー ファイルに STL をインクルードすると、どのような問題が発生する可能性がありますか? また、これは私のコードの移植性に影響しますか?

  3. DLL のヘッダー ファイルに STL をインクルードし、その DLL を他のコンピューターに取り込むと、どのような問題が発生する可能性がありますか?

  4. また、ヘッダーに STL を含める必要がある (すべきでない) 理由を教えてください。

4

4 に答える 4

2

PIMPL イディオムを使用して、STL 型を公開/エクスポートするヘッダーにコンパイル ファイアウォールを作成します。詳細

class MyList{
public:
//Some functions
private:
std::vector<int> _content;
};

Vs2012 で MyList を作成し、コンポーネントが VS2008 でビルドされている場合、VS2008 内のコードは STL 2008 に従ってメモリ レイアウトを想定しますが、レイアウトは STL 2012 のものになります。これにより、多くの問題が発生します。

  1. あなたのコンポーネントは、プラットフォームはおろかコンパイラ間でも移植できません。たとえば、メンバー変数として std::vector を使用して VS2008 でビルドされたコンポーネントは、VS2012 でコンパイルされたものとは異なるサイズになります。
  2. はい、古いバージョンでより最新の STL の機能を使用している場合を除き、ほとんどのシナリオでコードはコンパイラ間で互換性があります。
  3. 他のコンピューターに dll のランタイムがある限り問題ありません。
  4. 再利用可能なコードのために、dll/コンポーネントの境界を越えて stl 型を持つべきではありません。
于 2013-05-29T05:01:35.543 に答える
2

では、 STL で利用可能な型を前方宣言すると、コードの移植性 (プラットフォームに依存しないコードを本当に望んでいる人にとって) の観点からはどのような影響があるでしょうか?

標準 C++ と標準ライブラリを常に使用することは、移植性の特徴です。

ヘッダー ファイルに STL をインクルードすると、どのような問題が発生する可能性がありますか? そして、これは私のコードの移植性に影響しますか?

おそらくコンパイル時間が長くなりますか?繰り返しますが、上記の回答を参照してください。

DLL のヘッダー ファイルに STL をインクルードし、その DLL を他のコンピューターに取り込むと、どのような問題が発生する可能性がありますか?

ほとんどの場合、知る限り、DLL はクラスのメソッド定義のみを「保存」します。ファイルに STL ヘッダーを含める必要があり.hます。

また、ヘッダーに STL を含める必要がある (すべきでない) 理由を教えてください。

ほとんどの場合、STL を使用したいので、そうするべきです。Lounge<C++>に来れば、きっと悟りが開かれるでしょう。

于 2013-05-29T05:02:09.717 に答える
1

標準 C++ STL ライブラリを使用している場合、Microsoft Visual C++ と g++ の両方がこれらをサポートしているため、移植の問題は発生しない可能性があります。非標準の STL ヘッダーを使用しない限り、問題が発生します。

于 2013-05-29T04:57:10.503 に答える