我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?


当前回答

老实说,对我来说,这就像讨论缩进空间的数量。

在标头中使用指令会导致损坏。但是在C++文件中呢?如果同时使用两个名称空间,可能会发生这种情况。但如果你使用一个,它更多的是风格而不是真正的效率。

你知道为什么关于缩进的线索如此流行吗?任何人都可以说些什么,听起来非常聪明和有经验。

其他回答

只要在头文件中不使用“using namespace std”,这应该是完全正常的。

如果与say boost有命名冲突,那么在特定的.cpp文件中不使用此语句,但通过在其他文件中的每一行上不重复“std::”十次,仍然可以保存每个人的眼睛和手指。

不幸的是,现在这是一个纯粹的宗教问题,每个人都更容易/更有效地遵循一遍又一遍重复“std::”的既定模式。

如果您导入了右侧的头文件,您的全局范围中会突然出现十六进制、左侧、加号或count等名称。如果您不知道std::包含这些名称,这可能会令人惊讶。如果您也尝试在本地使用这些名称,可能会导致一些混淆。

如果所有的标准内容都在自己的命名空间中,那么就不必担心与代码或其他库的名称冲突。

另一个原因是惊讶。

如果我看到cout<<blah,而不是std::cout<<blah,我会想:这是什么cout?这是正常的服装吗?有什么特别的吗?

为什么使用命名空间标准?

C++有一个标准库,其中包含构建应用程序时使用的常用功能,如容器、算法等。如果这些库使用的名称是公开的,例如,如果它们全局定义了一个队列类,那么您将无法再次使用相同的名称而不发生冲突。因此,他们创建了一个名称空间std来包含此更改。

不使用的原因1:不良行为

使用命名空间std的语句通常被认为是错误的做法。此语句的另一种方法是在每次声明类型时使用作用域运算符(::)指定标识符所属的命名空间。尽管该语句避免了我们在任何时候希望访问std命名空间中定义的类或类型时键入std::,但它将整个std命名空间导入到程序的当前命名空间中。

不使用的原因2:编译器变得混乱

在玩具程序中导入整个std库是可以的,但在生产级代码中,这是不好的。使用命名空间std;使命名空间std中声明的每个符号都可以在没有命名空间限定符的情况下访问。

例如:

现在,假设您升级到一个较新版本的C++,并将更多新的std命名空间符号注入到您不知道的程序中。您的程序中可能已经使用了这些符号。现在编译器将很难弄清楚声明的符号是属于您自己的实现,还是来自您在没有任何概念的情况下导入的名称空间。一些编译器会抛出错误。如果运气不好,编译器选择了错误的实现并编译它,这肯定会导致运行时崩溃。

命名空间污染影响:

虽然这种做法对于示例代码来说是可以的,但将整个std命名空间拉入全局命名空间是不好的,因为它会破坏命名空间的目的,并可能导致名称冲突。这种情况称为命名空间污染。

短版本:不要在头文件中使用全局using声明或指令。可以在实现文件中使用它们。以下是Herb Sutter和Andrei Alexandrescu在C++编码标准中对这个问题的看法(我用粗体强调):

总结命名空间using是为了方便您,而不是为了强加给他人:不要在#include指令之前编写using声明或using指令。推论:在头文件中,不要使用指令或声明编写命名空间级别;相反,显式命名空间限定所有名称。(第二条规则与第一条规则相同,因为标头永远无法知道后面可能出现的其他标头#includes。)讨论简而言之:在#include指令之后,你可以也应该在你的实现文件中自由地使用命名空间使用声明和指令,并对此感到满意。尽管重复了相反的断言,但使用命名空间的声明和指令并不是邪恶的,它们不会破坏命名空间的目的。相反,它们使名称空间可用。