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

时间:2013-06-24 17:15:57

标签: c++ namespaces

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

3 个答案:

答案 0 :(得分:9)

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

实践各不相同 - 如果您正在处理具有大量不同库和名称冲突的大型项目,您可能希望一致地主动使用更多命名空间限定符,以便在添加新代码时您不必去制作旧代码更明确地说明它正在尝试使用它。

在风格上,有些人更喜欢确切地知道被引用的内容可能需要挖掘或遵循IDE“转到声明”功能(如果可用),而其他人喜欢简洁并且只能在“特殊的“对未包含的名称空间的引用 - 更具语境性的观点。

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

答案 1 :(得分:6)

First typedefs:

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文件中。 如果名字变得很长,或者我必须在同一个文件中大量使用这些类型,我倾向于使用上述其中一种。

答案 2 :(得分:3)

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