Winrt C++-是否在头文件中包含使用s的命名空间

Winrt C++ - include namespaces usings in header file?

本文关键字:包含使 命名空间 文件 C++- 是否 Winrt      更新时间:2023-10-16

可能的重复:
“使用命名空间”在c++头文件中

我是WPF领域的一名c#开发人员,但我决定用c++进行所有Winrt开发。

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

在头文件中包含using语句要容易得多。许多MicrosoftWinrt示例在标头中包含using语句,这使代码保持清晰易读。然而,我一直在浏览John Petzolds新书预览版中的c++示例,他要求页眉中没有所有using语句。

我不理解赞成和反对的观点,当我在谷歌上搜索时,我会收到很多反对意见。

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

感谢

在C++中,由于以下几个原因,通常在头文件中避免使用using名称空间。

与C#不同,C++没有一个整洁的模块系统。你在头文件中所做的任何事情都会影响到包含它的每个文件。因此,如果一个头文件有using namespace,那么它不仅会污染头文件本身,还会污染包含它的所有文件。这可能会导致令人惊讶的名称冲突。

因此,在C++中,最常见的约定是:从不将using namespace放在头中。在源文件中,如果你愿意,你可以这样做,但即使在那里,很多人也会回避

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

如果我提到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,而不是一种语言。

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