我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
有一个非常简单的答案:这是防御性编程。您知道,使用名称空间std;-可以使std::size_t、std::cout等的使用更容易一些我希望您不必相信这样的指令在标题中没有位置!然而,在翻译单元中,您可能会受到诱惑。。。
作为std命名空间一部分的类型、类等随着每次C++修订而增加。如果放松std::限定符,可能会有太多的歧义。放松std中经常使用的名称的限定符是完全合理的,例如,使用std::fprintf;,或者更可能的是:使用std::size_t;-但是,除非这些已经是语言的很好理解的部分(或者特别是C库的std包装),否则只使用限定符。
当您可以使用typedef并结合自动和decltype推理时,从可读性/可维护性的角度来看,实际上没有什么好处。
其他回答
对于不合格的导入标识符,您需要像grep这样的外部搜索工具来查找标识符的声明位置。这使得关于程序正确性的推理更加困难。
考虑
// myHeader.h
#include <sstream>
using namespace std;
// someoneElses.cpp/h
#include "myHeader.h"
class stringstream { // Uh oh
};
请注意,这是一个简单的示例。如果您有包含20个include和其他导入的文件,那么您将有大量的依赖项来解决问题。更糟糕的是,根据冲突的定义,在其他模块中可能会出现不相关的错误。
这并不可怕,但如果不在头文件或全局名称空间中使用它,您将省去麻烦。在非常有限的范围内执行它可能是正确的,但我从未遇到过键入额外的五个字符来澄清我的函数来自何处的问题。
是的,名称空间很重要。在我的项目中,我需要将一个var声明导入到源代码中,但在编译时,它与另一个第三方库冲突。
最后,我不得不用其他方法来解决这个问题,并使代码变得不那么清晰。
“为什么在C++中‘使用命名空间std;’被认为是一种糟糕的做法?”
我反过来说:为什么有些人认为额外键入五个字符很麻烦?
例如,考虑编写一个数字软件。当“vector”是问题领域最重要的概念之一时,我为什么还要考虑将通用的“std::vector”缩减为“vector”来污染我的全局命名空间?
另一个原因是惊讶。
如果我看到cout<<blah,而不是std::cout<<blah,我会想:这是什么cout?这是正常的服装吗?有什么特别的吗?