Winrt C++ - 在头文件中包含名称空间使用?

Dea*_*alk 2 c++ windows-8 windows-runtime c++-cx

可能重复:
c ++标头中的"using namespace"

我是WPF世界的开发人员,但我决定用C++完成所有Winrt开发.

让我感到困惑的一件事是using在头文件中使用(或不使用)语句(而不是键入完全限定的类型名称).

using在头文件中使用语句要容易得多.很多Microsoft Winrt示例都包含using标题中的语句,这些语句使代码清晰易读.但是,我一直在阅读John Petzolds新书预览中的c ++示例,并要求标题不受所有using陈述的影响.

我不了解专业人士和骗子,当我谷歌时,我得到了很多反对意见.

任何人都可以给我一个关于这个问题的明确解释,因为它与Winrt世界有关(我对其他环境中的c ++不感兴趣)

谢谢

jal*_*alf 8

在C++中,using由于多种原因,避免在头文件中使用名称空间是非常习惯的.

与C#不同,C++没有一个漂亮整洁的模块系统.您在标题中执行的任何操作都会影响包含它的每个文件.因此,如果一个标头有一个using namespace,如果有效污染不只是头文件本身,而是所有包含它的文件.这可能导致令人惊讶的名字冲突.

所以在C++中,最常见的约定是:永远不要放入using namespace标题.在源文件中,如果您愿意,可以执行此操作,但许多人甚至可以避免使用它.

另一个原因是这实际上有助于提高可读性:

如果我提到a vector<int>,那不清楚那什么.它可以是我在任何包含的头中的任何位置定义的任何向量类.

但如果我写std::vector<int>,那么我知道这是标准库头.它告诉我一个类型来自哪里.我认为这使代码更清晰,更容易阅读.

当然,如果您经常引用某些类型,或者某些名称空间具有冗长,冗长的名称,您可以使用一些技巧来使其更易于管理.

长命名空间名称可以别名:

namespace foo = VeryLongNamespaceName; 
// now I can do foo::bar instead of VeryLongNamespaceName::bar
Run Code Online (Sandbox Code Playgroud)

或者可以从命名空间导入个人名称:

using std::cout; 
// now I can refer to `cout` without the std prefix
Run Code Online (Sandbox Code Playgroud)

当然,C++开发人员倾向于使用平面命名空间层次结构和短命名空间名称并非巧合.

几乎所有的C++标准库都在std命名空间中,这比.NET等价物更容易输入.(std::vector<T>vs System.Collections.Generic.List<T>).短名称和平面层次意味着您实际上可以在没有using namespace陈述的情况下生活.

任何人都可以给我一个关于这个问题的明确解释,因为它与Winrt世界有关(我对其他环境中的c ++不感兴趣)

在这种情况下,没有"WinRT世界"这样的东西.如果您在WinRT应用程序中编写C++代码,那么您应该遵循C++ conventinos和最佳实践.如果您在WinRT应用程序中编写C#代码,那么您应该遵循C#最佳实践,依此类推.

WinRT指南没有任何地方声明"请忽略您通常使用的语言所做的一切".WinRT是一种API,而不是一种语言.

至于为什么微软的样品不这样做:它们就是样品.他们的目标是说明具体的概念,并给你一个起点,而不是教你一般编写好的代码.假设您可以采用它们所说明的概念,并将其放入您自己的代码中,而无需复制样本中采用的各种快捷方式.出于同样的原因,许多样本也省略了错误处理代码.它与样本的目的无关,但在实际应用中肯定不相关.