关于c ++:使用命名空间std与其他替代方案


Using namespace std vs other alternatives

本问题已经有最佳答案,请猛点这里访问。
1
using namespace std;

到目前为止,在我的计算机科学课程中,这是我们被告知要做的全部事情。不仅如此,这也是我们被允许做的所有事情,否则我们的代码会受到惩罚。我了解,通过查看在线发布的代码,您可以使用::std或std::来完成相同的事情。

我的问题是一般性的为什么?显然,为了学习者和简单起见,使用全球宣言更简单,但收回的是什么?在现实世界中期望::std更现实吗?我想补充一下,使用声明背后的逻辑/概念是什么?在我的课程中没有解释过这些,我想更好地理解它。

作为一个普遍的问题:如果我还没有教过这些内容,向量,模板,类,或错误处理似乎我错过了很多重要的C++功能吗?

事先谢谢!


这确实是你可以在啤酒里讨论几个小时的事情之一,但仍然没有一个大家都满意的答案。

如果您几乎总是使用std::功能,那么在文件开头添加using namespace std;并不是一个坏主意。另一方面,如果您使用多个命名空间中的内容(例如,使用llvm::编写编译器,同时使用std::编写编译器),可能会混淆哪些部分是llvm的一部分,哪些部分是std::的部分,因此在我的编译器项目中,我没有using namespace ...;的单个文件,而是编写llvm::std::根据需要。有几个函数(可能是不明智的)称为Type(),有些地方使用something->Type()->Type()来获得我需要的类型。是的,有时甚至让我有点困惑…

我还有很多东西看起来像Constants::ConstDeclToken::RightParen,所以我可以很快看到"什么是什么"。所有这些都可以缩短和"简化",但我更喜欢看到东西大部分时间都属于哪里。

更冗长的内容有助于更容易地看到事物的归属——但它有助于更多的打字和阅读,所以这是一种平衡。


我个人不喜欢使用声明。对我来说,它们使代码不可读,并且破坏了名称空间。作为一名维护程序员,我已经花了20年的时间,我讨厌任何使代码难以阅读的东西——在我看来,使用和抛出规范一样无用。

更容易理解的是6个月——一年——10年

1
2
3
4
UDP::Socket sock
sock.send(data)
TCP::Socket sock2
sock2.send(data)

VS

1
2
3
4
using UDP;
using TCP;
sock.send(data)
sock2.end(data)

我也不喜欢名称空间别名

1
using namespace po = boost::program_options;

现在,您要让下一个程序员更努力地工作,通过一个额外的间接级别来查找与boost::program_选项相比,po是什么。同样的情况也发生在

1
typedef long QUADWORD;

四字的大小是多少?长4个字节有多长?在我的操作系统上8字节或17字节

我最后要做的是,如果你不能打字,那就不要当程序员——一个已保存的击键!=良好的可维护代码


general why?

命名是软件开发中比较困难的方面之一。初学者根本不知道他们的名字选择以后会如何产生歧义。

特别是,我们的软件行话经常对某些问题使用首选术语。这些首选项可能会导致不相关的类实例使用具有相似含义的相同(或类似)符号进行开发。

我经常使用的一些符号包括init()、exec()、load()、store(),我在很多地方使用timestampget()。我还使用open()、close()、send()/recv()或write()/read()。

所以,我可以在3个名称空间中的每个空间中重命名in it(),并在其中添加了5个对象,但是指定我想要的对象要简单得多。我在2个名称空间和12个对象中找到exec()。我使用了3种不同的timestampget()方法。无论是名称空间、函数还是类方法,这些符号对我来说都是有意义的。

此外,我发现5个字符的"std::"名称空间作为前缀是完全自然的,比全局的"使用名称空间std"更可取。我想这是练习的结果。

还有一个项目——任何一个较大的名称空间或类名变得令人厌烦的地方,我有时会添加一个typedef短名称…以下是一些生产代码示例:

1
2
3
typedef ALARM_HISTORY   ALM_HST;
typedef MONITOR_ITEM    MI
typedef BACKUP_CONTROL  BC;

在一个团队中,我们同意使用定义明确的"全名",因为篇幅太长,有时会让人感到厌烦。在项目的后面,我们同意typedef(用于短类或名称空间名称)可以在简单的情况下使用,并且不会增加混淆。


我想说的是,一般来说,你不会在全球范围内宣布使用性病。我想如果你只是做一个简单的申请,那就足够了。但是,在大型组织中工作时,经常会使用不同的名称空间,这些名称空间可能有重叠的对象。如果您在std和您创建的名称空间中有一个函数,然后调用"using namespace std"和"using namespace yournamespace",那么在调用该函数时会得到不需要的结果。当您为每个调用加上名称空间前缀时,它会使其更清晰,并且不会出现重叠问题。