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

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

1
C++中的Google命名空间:使用"using std::string"或者"using namespace std"。 - Son-Huy Pham
没有看到相关代码,这个问题无法回答。但是,在名称前面有一长串由“::”分隔的命名空间名称可能是不正确的。 - Pete Becker
这个“相当流行和稳定的开源库”可能是Boost吗? - statueuphemism
@statueuphemism:Boost 不是一个库。 - Lightness Races in Orbit
@Lightness Races in Orbit,感谢您的技术纠正。由于Boost有一个可下载的版本化包含所有库的程序包,而且所有链接都是自动完成的,所以我倾向于将其视为一个库。 - statueuphemism
@statueuphemism:是的,我也是,我只是为了好玩而已在闹 :-) - Lightness Races in Orbit
3个回答

12
他们可能认为这比回答许多问题更容易,这些问题来自于尝试示例代码并发现它无法工作的人,仅仅因为他们没有"使用"相关的命名空间。
实践有所不同 - 如果您正在开发具有许多不同库和名称冲突的大型项目,您可能希望主动使用更多的命名空间限定符,以便在添加新代码时,无需去修改旧代码,即可明确其尝试使用的内容。
在样式上,有些人更喜欢确切知道指的是什么而不是必须挖掘或者使用IDE的"go to declaration"功能(如果有的话),而其他人则喜欢简洁,并且只在对未包含某个命名空间的“异常”引用上看到更完整的命名空间限定 - 更具上下文的视角。
通常避免将 "using namespace xxx;" 放在头文件中,因为包括该头文件的客户端代码将无法关闭它,并且该名称空间的内容将永久地被转储到它们的默认"搜索空间"中。因此,如果您查看头文件中的代码,则这可能是更加详细的原因。与此形成对比的是,您可以在范围内(例如函数体)中使用 "using namespace",甚至在头文件中也可以,而且不会影响其他代码。更正常的做法是从实现文件中使用命名空间,您预计这将是翻译单元中的最终文件,编译成要链接到最终可执行文件中的库或对象,或者是本身创建可执行文件的翻译单元。

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

Third "using namespace"

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

最佳实践:不要经常使用'using'和'using namespace'。当你必须使用它时(有时可以使代码更清晰),永远不要将其放在头文件中,而是放在.cpp文件中。 如果名称变得非常长或者我必须在同一个文件中多次使用类型,则我倾向于使用上述其中之一。


你真的更喜欢使用typedef而不是using吗? - aaronman
仅适用于 STL 类型。如第一个示例所示,这些类型往往会变得相当长。我只想计算可能性,而不是对它们进行排名。 - Marius
2
我认为MyTypeItconst_iterator更好。 - Lightness Races in Orbit
3
C++11来拯救大家了!现在每个人都可以通过"using"感到快乐:https://dev59.com/cWgv5IYBdhLWcg3wPObz - statueuphemism

3

如果您正在编写自己的库,肯定会广泛使用命名空间。在核心应用程序中,应使用更少的命名空间。关于像 std::string 这样做而不是以 using namespace std; 开始,我认为第一个版本更好,因为它更具描述性,且出错的可能性更小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接