我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
您需要能够阅读与您不同风格和最佳实践意见的人编写的代码。如果你只使用cout,没有人会感到困惑。但是,当你有很多名称空间到处飞的时候,你看到这个类,你不太确定它做什么时,让名称空间显式充当某种注释。您可以第一眼看到,“哦,这是一个文件系统操作”或“这是在做网络工作”。
其他回答
这都是关于管理复杂性的。使用名称空间会将您不想要的东西拉进来,因此可能会使调试变得更困难(我说可能)。到处使用std::很难阅读(更多的文本等等)。
马的课程-管理你的复杂性,尽你最大的能力和感觉。
我也认为这是一种糟糕的做法。为什么?就在一天,我认为名称空间的功能是划分内容,所以我不应该将所有内容都放在一个全局包中而破坏它。
然而,如果我经常使用“cout”和“cin”,我会写:使用std::cout;使用std::cin;在.cpp文件中(当它使用include传播时,不会在头文件中)。我想,没有一个理智的人会说出一条小溪的名字
为什么使用命名空间标准?
C++有一个标准库,其中包含构建应用程序时使用的常用功能,如容器、算法等。如果这些库使用的名称是公开的,例如,如果它们全局定义了一个队列类,那么您将无法再次使用相同的名称而不发生冲突。因此,他们创建了一个名称空间std来包含此更改。
不使用的原因1:不良行为
使用命名空间std的语句通常被认为是错误的做法。此语句的另一种方法是在每次声明类型时使用作用域运算符(::)指定标识符所属的命名空间。尽管该语句避免了我们在任何时候希望访问std命名空间中定义的类或类型时键入std::,但它将整个std命名空间导入到程序的当前命名空间中。
不使用的原因2:编译器变得混乱
在玩具程序中导入整个std库是可以的,但在生产级代码中,这是不好的。使用命名空间std;使命名空间std中声明的每个符号都可以在没有命名空间限定符的情况下访问。
例如:
现在,假设您升级到一个较新版本的C++,并将更多新的std命名空间符号注入到您不知道的程序中。您的程序中可能已经使用了这些符号。现在编译器将很难弄清楚声明的符号是属于您自己的实现,还是来自您在没有任何概念的情况下导入的名称空间。一些编译器会抛出错误。如果运气不好,编译器选择了错误的实现并编译它,这肯定会导致运行时崩溃。
命名空间污染影响:
虽然这种做法对于示例代码来说是可以的,但将整个std命名空间拉入全局命名空间是不好的,因为它会破坏命名空间的目的,并可能导致名称冲突。这种情况称为命名空间污染。
一个例子是,使用名称空间std会因为计数的模糊性而引发编译错误,这也是算法库中的一个函数。
#include <iostream>
#include <algorithm>
using namespace std;
int count = 1;
int main() {
cout << count << endl;
}
下面是一个示例,展示了如何使用命名空间std;可能会导致名称冲突问题:
无法在C中定义全局变量++
在本例中,一个非常通用的算法名称(std::count)与一个非常合理的变量名称(count)冲突。
推荐文章
- cplusplus.com给出的错误、误解或坏建议是什么?
- 找出质数最快的算法是什么?
- c++枚举类可以有方法吗?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 在函数的签名中添加关键字
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 为什么在标准容器中使用std::auto_ptr<>是错误的?
- 用比较double和0
- 保护可执行文件不受逆向工程的影响?
- 在c++中字符串前面的“L”是什么意思?
- 为什么std::map被实现为红黑树?
- 空括号的默认构造函数