在C++中使用完全限定名称

Using fully qualified names in C++

本文关键字:定名称 C++      更新时间:2023-10-16

我是一个C++新手,在处理一个需要它的项目时,我试图并行学习该语言。我使用一个相当流行和稳定的开源库来完成很多繁重的工作。通过阅读该库的源代码、教程和代码示例,我注意到它们在声明类型时总是使用完全限定的名称,这通常会导致非常的长而冗长的行中有很多:s。这被认为是C++中的最佳实践吗?有什么不同的方法来处理这个问题吗?

他们可能发现这比回答那些尝试示例代码但发现它不起作用的人的许多问题更容易,因为他们没有"使用"所涉及的命名空间。

实践各不相同——如果你正在处理一个有很多不同库和名称冲突的大型项目,你可能希望主动地一致使用更多的命名空间限定符,这样在添加新代码时,你就不必让旧代码更明确地说明它要使用什么。

从风格上讲,有些人更喜欢确切地知道所指的是什么,这可能意味着必须挖掘或遵循IDE的"转到声明"功能(如果可用),而另一些人则喜欢简洁,只在对未包含的名称空间的"特殊"引用上看到更全面的名称空间限定,这是一个更上下文的视角。

避免在头文件中使用"using namespace xxx;"也是正常的,因为包括该头的客户端代码将无法关闭它,并且该名称空间的内容将永久转储到其默认的"搜索空间"中。所以,如果你在头中查看代码,这也是它们可能更明确的原因之一。与此相反,您可以在函数体等作用域中使用"using-namespace",即使是在标头中,它也不会影响其他代码。更正常的做法是使用实现文件中的命名空间,您希望该文件是翻译单元中的最终文件,编译到将链接到最终可执行文件中的库或对象,或者可能是自己创建可执行文件的翻译单元。

第一种类型定义:

typedef std::vector<MyTypeWithLongName>::const_iterator MyTypeIt;
//use MyTypeIt from now on

第二次"使用"

using std::string;
//use string instead of std::string from now on

第三个"使用命名空间"

using namespace std;
//Use all things from std-namespace without std:: in front (string, vector, sort etc.)

最佳做法是:不要经常使用"using"answers"using namespace"。当您必须使用它(有时使代码更干净)时,不要将它放在头中,而是放在.cpp文件中。如果名称太长,或者我必须在同一个文件中大量使用类型,我倾向于使用上面的其中一个。

如果你正在编写自己的库,你肯定会大量使用名称空间,在你的核心应用程序中,应该会有更少的使用。至于做std::string之类的事情,而不是从using namespace std; imo开始,第一个版本更好,因为它更具描述性,不太容易出错