using
C++ では、いくつかの理由から、ヘッダー ファイルで名前空間を避けるのが非常に一般的です。
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 のサンプルがそうでない理由については、サンプルです。彼らの目標は、特定の概念を説明し、出発点を提供することであり、一般的に優れたコードを書くことを教えることではありません。サンプルで説明されているさまざまなショートカットをコピーせずに、それらが示す概念を使用して、独自のコードに適合させることができると想定されています。多くのサンプルでは、同じ理由でエラー処理コードも省略されています。サンプルの目的には関係ありませんが、実際のアプリケーションでは関係ないことは確かです。