Winrt C++-是否在头文件中包含使用s的命名空间
Winrt C++ - include namespaces usings in header file?
可能的重复:
“使用命名空间”在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,而不是一种语言。
至于为什么微软的样本会做其他的事情:它们是样本。他们的目标是说明具体的概念,给你一个起点,而不是教你写好的代码。假设您可以采用它们所示的概念,并将其融入您自己的代码中,而无需复制示例中采用的各种快捷方式。出于同样的原因,许多示例也省略了错误处理代码。它与示例的目的无关,但在实际应用程序中肯定不是无关的。
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 命名空间 std:: 不包含可选
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 更智能地在C++中包含保护,以便在不同的命名空间中多次包含标头
- 在命名空间内使用函数的循环包含
- C++使用其他命名空间中的符号,而不使它们可从外部访问
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 在命名空间内的 lambda 中使用时未找到运算符重载
- 与自定义命名空间一起使用时实现 std::error_category、名称解析问题
- 有没有办法转发声明命名空间或只是提前使其可见
- 即使在包含 std 命名空间之后,fstream 在 Visual Studio 2017 中也无法正常工作
- 在命名空间中包含旧库C++
- 包含所有命名空间 std 的文件
- 如何使客户端无法访问命名空间的函数
- 如何使函数模板仅适用于特定命名空间中的类型
- 包含命名空间的类模板的前向声明会导致编译错误
- 在命名空间外包含标题
- 如果函数包含在命名空间中,则"go to beginning of the function"不起作用 (C++)
- 在c++中使命名空间私有