我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?


当前回答

我不认为这在任何情况下都是不好的做法,但在使用它时都需要小心。如果你正在编写一个库,你可能应该在命名空间中使用作用域解析运算符,以防止你的库与其他库冲突。对于应用程序级代码,我看不出它有什么问题。

其他回答

在类的头文件中使用名称空间的问题在于,它迫使任何想要使用您的类(通过包括头文件)的人也“使用”(即查看其他名称空间中的所有内容)。

但是,您可以随意在(私有)*.cpp文件中放入using语句。


请注意,有些人不同意我这样说的“感觉自由”,因为尽管cpp文件中的using语句比头文件中的要好(因为它不会影响包含头文件的人),但他们认为这仍然不好(因为根据代码的不同,这可能会使类的实现更难维护)。这个C++超级FAQ条目说,

using指令存在于遗留的C++代码中,用于简化向命名空间的转换,但您可能不应该定期使用它,至少不应该在新的C++代码。

常见问题解答建议了两种选择:

使用声明:使用std::cout;//using声明允许您无条件使用coutcout<<“值:”;只需键入std::std::cout<<“值:”;

只要在头文件中不使用“using namespace std”,这应该是完全正常的。

如果与say boost有命名冲突,那么在特定的.cpp文件中不使用此语句,但通过在其他文件中的每一行上不重复“std::”十次,仍然可以保存每个人的眼睛和手指。

不幸的是,现在这是一个纯粹的宗教问题,每个人都更容易/更有效地遵循一遍又一遍重复“std::”的既定模式。

我同意这里的其他观点,但我想解决有关可读性的问题——您可以通过在文件、函数或类声明的顶部使用typedef来避免所有这些问题。

我通常在类声明中使用它,因为类中的方法倾向于处理类似的数据类型(成员),typedef是一个在类上下文中分配有意义的名称的机会。这实际上有助于类方法定义的可读性。

// Header
class File
{
   typedef std::vector<std::string> Lines;
   Lines ReadLines();
}

在实施过程中:

// .cpp
Lines File::ReadLines()
{
    Lines lines;
    // Get them...
    return lines;
}

而不是:

// .cpp
vector<string> File::ReadLines()
{
    vector<string> lines;
    // Get them...
    return lines;
}

or:

// .cpp
std::vector<std::string> File::ReadLines()
{
    std::vector<std::string> lines;
    // Get them...
    return lines;
}

我最近遇到了关于VisualStudio2010的投诉。事实证明,几乎所有的源文件都有这两行:

using namespace std;
using namespace boost;

许多Boost功能将进入C++0x标准,而Visual Studio 2010有许多C++0x功能,因此这些程序突然无法编译。

因此,避免使用名称空间X;是一种未来校对的形式,一种确保对正在使用的库和/或头文件的更改不会破坏程序的方法。

另一个原因是惊讶。

如果我看到cout<<blah,而不是std::cout<<blah,我会想:这是什么cout?这是正常的服装吗?有什么特别的吗?