我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
#include <iostream>
using namespace std;
int main() {
// There used to be
// int left, right;
// But not anymore
if (left != right)
std::cout << "Excuse me, WHAT?!\n";
}
那么,为什么?因为它引入了与常用变量名重叠的标识符,并允许编译此代码,将其解释为if(std::left!=std::right)。
PVS Studio可以使用V1058诊断程序找到这样的错误:https://godbolt.org/z/YZTwhp(谢谢Andrey Karpov!!)。
Ping cppcheck开发人员:您可能希望标记此项。这是一场灾难。
其他回答
我认为本地或全球使用应取决于应用程序。
因为,当我们在本地使用库时,有时代码会变得一团糟。可读性将下降。
因此,只有在可能发生冲突时,我们才应该在本地使用库。
我不是一个更有经验的人。所以,如果我错了,请告诉我。
一个例子是,使用名称空间std会因为计数的模糊性而引发编译错误,这也是算法库中的一个函数。
#include <iostream>
#include <algorithm>
using namespace std;
int count = 1;
int main() {
cout << count << endl;
}
是的,名称空间很重要。在我的项目中,我需要将一个var声明导入到源代码中,但在编译时,它与另一个第三方库冲突。
最后,我不得不用其他方法来解决这个问题,并使代码变得不那么清晰。
我同意不应该在全球范围内使用它,但在本地使用它并没有那么糟糕,就像在命名空间中一样。下面是“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)在另一个作用域中可访问的名称。
在类的头文件中使用名称空间的问题在于,它迫使任何想要使用您的类(通过包括头文件)的人也“使用”(即查看其他名称空间中的所有内容)。
但是,您可以随意在(私有)*.cpp文件中放入using语句。
请注意,有些人不同意我这样说的“感觉自由”,因为尽管cpp文件中的using语句比头文件中的要好(因为它不会影响包含头文件的人),但他们认为这仍然不好(因为根据代码的不同,这可能会使类的实现更难维护)。这个C++超级FAQ条目说,
using指令存在于遗留的C++代码中,用于简化向命名空间的转换,但您可能不应该定期使用它,至少不应该在新的C++代码。
常见问题解答建议了两种选择:
使用声明:使用std::cout;//using声明允许您无条件使用coutcout<<“值:”;只需键入std::std::cout<<“值:”;