15

私は C++ の初心者で、言語を必要とするプロジェクトに取り組んでいるときに、言語を並行して学習しようとしています。私はかなり人気のある安定したオープン ソース ライブラリを使用して、多くの手間のかかる作業を行っています。ライブラリのソース、チュートリアル、コード サンプルを読んでいると、型を宣言するときに常に完全修飾名が使用されていることに気付きまし。これは C++ でのベスト プラクティスと見なされますか? これに対処する別の方法はありますか?

4

3 に答える 3

10

コード例を試してみて、名前空間を「使用」しなかったという理由だけで機能しないことがわかった人々からの多くの質問に答えるよりも、彼らは簡単だと思ったかもしれません。

プラクティスはさまざまです。多数の多様なライブラリと名前の衝突を伴う大規模なプロジェクトに取り組んでいる場合は、新しいコードを追加するときに古いコードをさらに作成する必要がないように、一貫してより多くの名前空間修飾子を積極的に使用することをお勧めします。何を使おうとしているのかを明確にします。

文体的には、何が参照されているかを正確に知ることを好む人もいれば、IDE の「宣言に移動」機能 (利用可能な場合) を掘り下げたり従わなければならない可能性があることを好む人もいれば、簡潔さを好み、「例外的な」参照でのみより完全な名前空間修飾を確認する人もいます。含まれていない名前空間に - より文脈的な視点。

「using namespace xxx;」を避けるのも普通です。そのヘッダーを含むクライアントコードはそれをオフにすることができず、その名前空間の内容はデフォルトの「検索スペース」に永続的にダンプされるためです。そのため、ヘッダー内のコードを見ている場合、それがより明示的である可能性がある理由の 1 つです。それとは対照的に、関数本体などのスコープ内 (ヘッダー内であっても) で「名前空間を使用する」ことができ、他のコードには影響しません。翻訳単位の最終ファイルであると予想される実装ファイル内から名前空間を使用し、最終的な実行可能ファイルにリンクするライブラリまたはオブジェクト、またはおそらくそれ自体が作成する翻訳単位にコンパイルするのがより一般的です。実行可能ファイル。

于 2013-06-24T17:31:36.650 に答える
8

最初の typedef:

typedef std::vector<MyTypeWithLongName>::const_iterator MyTypeIt;
//use MyTypeIt from now on

第二の「使う」

using std::string;
//use string instead of std::string from now on

3番目の「名前空間の使用」

using namespace std;
//Use all things from std-namespace without std:: in front (string, vector, sort etc.)

ベスト プラクティスとして、'using' と 'using namespace' を多用しないでください。それを使用する必要がある場合 (コードをきれいに保つ場合もあります) は、ヘッダーではなく .cpp ファイルに入れます。名前が非常に長くなる場合、または同じファイルでタイプを頻繁に使用する必要がある場合は、上記のいずれかを使用する傾向があります。

于 2013-06-24T17:35:22.870 に答える
3

独自のライブラリを作成している場合、名前空間を多用することは確かです。コア アプリケーションでは使用量を減らす必要があります。imostd::stringで開始する代わりに次のようなことを行う場合は、最初のバージョンの方が優れています。using namespace std;

于 2013-06-24T17:36:05.990 に答える