在 C++ 中,出于多种原因,非常习惯于using
在头文件中避免命名空间。
与 C# 不同,C++ 没有一个整洁的模块系统。您在标题中所做的任何事情都会影响包含它的每个文件。因此,如果一个标头具有using namespace
, if 不仅会污染头文件本身,还会污染包含它的所有文件。这可能会导致令人惊讶的名称冲突。
所以在 C++ 中,最常见的约定是:永远不要放入using namespace
标题。在源文件中,您可以根据需要执行此操作,但即使在源文件中也有很多人避免使用它。
另一个原因是这实际上可以提高可读性:
如果我指的是 a 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,而不是一种语言。
As for why Microsoft's samples do otherwise: they're samples. Their goal is to illustrate specific concepts and give you a starting point, and not to teach you to write good code in general. It is assumed that you can take the concepts they illustrate, and fit it into your own code without copying the various shortcuts taken in the samples. Many samples also omit error handling code for the same reason. It's irrelevant for the purposes of the sample, but certainly not irrelevant in a real application.