我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
我最近遇到了关于VisualStudio2010的投诉。事实证明,几乎所有的源文件都有这两行:
using namespace std;
using namespace boost;
许多Boost功能将进入C++0x标准,而Visual Studio 2010有许多C++0x功能,因此这些程序突然无法编译。
因此,避免使用名称空间X;是一种未来校对的形式,一种确保对正在使用的库和/或头文件的更改不会破坏程序的方法。
其他回答
一个例子是,使用名称空间std会因为计数的模糊性而引发编译错误,这也是算法库中的一个函数。
#include <iostream>
#include <algorithm>
using namespace std;
int count = 1;
int main() {
cout << count << endl;
}
我同意不应该在全球范围内使用它,但在本地使用它并没有那么糟糕,就像在命名空间中一样。下面是“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)在另一个作用域中可访问的名称。
根据我的经验,如果你有多个库使用cout,但出于不同的目的,你可能会使用错误的cout。
例如,如果我键入,使用名称空间std;并使用命名空间otherlib;如果只键入cout(恰好两者都有),而不是std::cout(或'otherlib::cout'),则可能会使用错误的一个,并出现错误。使用std::cout更有效。
这里有一个我在其他答案中都没有找到的观点:只使用一个名称空间。根据大多数答案,命名空间不好的主要原因是,你可能会有冲突的函数名,这会导致一片混乱。但是,如果只使用一个名称空间,则不会发生这种情况。确定您将使用最多的库(可能使用名称空间std;)并坚持使用它。
可以认为它有一个不可见的库前缀-std::vector变成了vector。在我看来,这是两全其美的:一方面,它减少了必须进行的键入(正如名称空间所预期的那样),另一方面,为了清晰和安全,它仍然需要使用前缀。如果有一个函数或对象没有名称空间前缀,那么您知道它来自您声明的一个名称空间。
请记住,如果您决定在全球范围内使用一个,请不要在本地使用其他。这又回到了其他答案,即本地名称空间通常比全局名称空间更有用,因为它们提供了各种便利。
同时使用多个命名空间显然是一个灾难,但在我看来,使用JUST命名空间std和仅使用命名空间std并不是什么大问题,因为重新定义只能由您自己的代码进行。。。
因此,只需将它们的函数视为保留名称,如“int”或“class”即可。
人们不应该对此如此吹毛求疵。你的老师一直都是对的。只需使用一个名称空间;这就是首先使用名称空间的全部意义。您不应该同时使用多个。除非它是你自己的。因此,再次定义不会发生。
推荐文章
- 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被实现为红黑树?
- 空括号的默认构造函数