我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
我同意不应该在全球范围内使用它,但在本地使用它并没有那么糟糕,就像在命名空间中一样。下面是“C++编程语言”中的一个示例:
namespace My_lib {
using namespace His_lib; // Everything from His_lib
using namespace Her_lib; // Everything from Her_lib
using His_lib::String; // Resolve potential clash in favor of His_lib
using Her_lib::Vector; // Resolve potential clash in favor of Her_lib
}
在本例中,我们解决了由它们的组合引起的潜在名称冲突和歧义。
在那里显式声明的名称(包括通过使用His_lib::String等声明声明的名称)优先于通过using指令(使用名称空间Her_lib)在另一个作用域中可访问的名称。
其他回答
如果您导入了右侧的头文件,您的全局范围中会突然出现十六进制、左侧、加号或count等名称。如果您不知道std::包含这些名称,这可能会令人惊讶。如果您也尝试在本地使用这些名称,可能会导致一些混淆。
如果所有的标准内容都在自己的命名空间中,那么就不必担心与代码或其他库的名称冲突。
“为什么在C++中‘使用命名空间std;’被认为是一种糟糕的做法?”
我反过来说:为什么有些人认为额外键入五个字符很麻烦?
例如,考虑编写一个数字软件。当“vector”是问题领域最重要的概念之一时,我为什么还要考虑将通用的“std::vector”缩减为“vector”来污染我的全局命名空间?
这取决于它的位置。如果它是一个公共的头,那么通过将其合并到全局名称空间中,可以减小名称空间的值。请记住,这可能是制作模块全局的一种简单方法。
考虑两个名为Foo和Bar的库:
using namespace foo;
using namespace bar;
一切都很好,你可以从Foo调用Blah(),从Bar调用Qux()。但有一天你升级到了Foo 2.0的新版本,它现在提供了一个名为Qux()的函数。现在出现了一个冲突:Foo 2.0和Bar都将Qux()导入到全局命名空间中。这将需要一些努力来解决,特别是如果函数参数恰好匹配。
如果您使用了foo::Blah()和bar::Qux(),那么引入foo::Qux()将是一个非事件。
根据我的经验,如果你有多个库使用cout,但出于不同的目的,你可能会使用错误的cout。
例如,如果我键入,使用名称空间std;并使用命名空间otherlib;如果只键入cout(恰好两者都有),而不是std::cout(或'otherlib::cout'),则可能会使用错误的一个,并出现错误。使用std::cout更有效。
推荐文章
- 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被实现为红黑树?
- 空括号的默认构造函数