15

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

4

3 回答 3

10

他们可能发现这比回答尝试示例代码并发现它不起作用的人的许多问题更容易,只是因为他们没有“使用”所涉及的名称空间。

实践各不相同——如果你正在处理一个包含大量不同库和名称冲突的大型项目,你可能希望主动使用更多的命名空间限定符,这样当你添加新代码时,你就不必去修改旧代码了明确说明它试图使用什么。

从风格上讲,有些人更喜欢确切地知道所指的内容,而不是可能不得不挖掘或遵循 IDE“转到声明”功能(如果可用),而其他人则喜欢简洁,并且只在“特殊”引用中查看更完整的命名空间限定到尚未包含的命名空间 - 更符合上下文的观点。

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

于 2013-06-24T17:31:36.650 回答
8

第一个 typedef:

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' 和 'using namespace'。当你必须使用它(有时保持代码更干净)时,不要把它放在头文件中,而是放在 .cpp 文件中。如果名称变得很长,或者我必须在同一个文件中大量使用这些类型,我倾向于使用上述其中一种。

于 2013-06-24T17:35:22.870 回答
3

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

于 2013-06-24T17:36:05.990 回答