2

重複の可能性:
C++ ヘッダーの「名前空間の使用」

私は WPF の世界では ac# 開発者ですが、Winrt 開発はすべて C++ で行うことにしました。

私が混乱していることの 1 つは、(using完全修飾型名を入力するのではなく) ヘッダー ファイルでステートメントを使用する (または使用しない) ことです。

usingヘッダーファイルにステートメントを含める方がはるかに簡単です。Microsoft Winrt のサンプルの多くにはusing、ヘッダーにステートメントが含まれているため、コードが明確で読みやすくなっています。しかし、私は John Petzold の新しい本のプレビューで c++ のサンプルを見てきましたusing

私は賛否両論を理解していません。グーグルで検索すると、反対意見がたくさん出てきます。

この問題はWinrtの世界に関連しているため、誰かが私にこの問題の決定的な説明をしてもらえますか(私は他の環境でのc ++には興味がありません)

ありがとう

4

1 に答える 1

9

usingC++ では、いくつかの理由から、ヘッダー ファイルで名前空間を避けるのが非常に一般的です。

C# とは異なり、C++ には整然としたモジュール システムがありません。ヘッダーで行うことは、それを含むすべてのファイルに影響します。したがって、1 つusing namespaceのヘッダーに . これは、驚くべき名前の衝突につながる可能性があります。

そのため、C++ では、最も一般的な規則は次のとおりです。ヘッダーを挿入しないでください。using namespaceソースファイルでは、必要に応じて実行できますが、多くの人はそれを避けています。

もう1つの理由は、これが実際に読みやすさを助けることができるということです:

を参照するとvector<int>、それが何であるかは明確ではありませ。これは、インクルードされたヘッダーの任意の場所で定義された任意のベクター クラスである可能性があります。

しかし、私が書いた場合、これが標準ライブラリのヘッダーであることがstd::vector<int>わかります。型がどこから来たかを教えてくれます。これにより、コードがより明確になり、読みやすくなると思います。

もちろん、特定の型を頻繁に参照する場合や、特定の名前空間に長くて冗長な名前が含まれている場合は、これをより管理しやすくするために使用できるトリックがあります。

長いネームスペース名には別名を付けることができます:

namespace foo = VeryLongNamespaceName; 
// now I can do foo::bar instead of VeryLongNamespaceName::bar

または個々の名前を名前空間からインポートできます。

using std::cout; 
// now I can refer to `cout` without the std prefix

もちろん、C++ 開発者がフラットな名前空間階層と短い名前空間名を使用する傾向があるのは偶然ではありません。

C++ 標準ライブラリのほぼすべてがstd名前空間にあり、これは .NET の同等のものよりも入力が少し簡単です。(std::vector<T>System.Collections.Generic.List<T>)。短い名前とフラットな階層は、実際にはusing namespaceステートメントなしで生活できることを意味します。

この問題はWinrtの世界に関連しているため、誰かが私にこの問題の決定的な説明をしてもらえますか(私は他の環境でのc ++には興味がありません)

このコンテキストでは、"WinRT の世界" などはありません。WinRT アプリケーションで C++ コードを記述する場合は、C++ の規則とベスト プラクティスに従う必要があります。WinRT アプリケーションで C# コードを記述する場合は、C# のベスト プラクティスに従う必要があります。

WinRT ガイドラインのどこにも、「使用している言語で通常行うことはすべて無視してください」とは記載されていません。WinRT は API であり、言語ではありません。

Microsoft のサンプルがそうでない理由については、サンプルです。彼らの目標は、特定の概念を説明し、出発点を提供することであり、一般的に優れたコードを書くことを教えることではありません。サンプルで説明されているさまざまなショートカットをコピーせずに、それらが示す概念を使用して、独自のコードに適合させることができると想定されています。多くのサンプルでは、​​同じ理由でエラー処理コードも省略されています。サンプルの目的には関係ありませんが、実際のアプリケーションでは関係ないことは確かです。

于 2012-09-28T12:31:35.203 に答える