3

我有一个 C++ 项目(VC++ 2008),它只在许多源文件中使用 std 命名空间,但我找不到放置“使用命名空间 std;”的“正确”位置。

如果我把它放在 main.cpp 中,它似乎不会传播到我的其他源文件中。当我把它放在头文件中时,我让它工作了,但后来我被告知这很糟糕。如果我将它放在所有 .cpp 文件中,编译器将无法识别 std 命名空间。

这应该怎么做?

4

6 回答 6

2

在您的标题中,我认为最好的办法就是完全限定名称空间,例如成员

#include <list>

class CYourClass
{
    std::list<int> myListOfInts;
    ...
};

您可以继续完全符合 cpp 中的任何功能

int CYourClass::foo()
{
    std::list<int>::iterator iter = myListOfInts.begin();
    ...
}

你真的永远不需要在任何地方“使用命名空间标准”。仅当您发现输入 std:: 太多时,才可以输入“使用命名空间 std”以节省您自己的击键并提高代码的可读性。这将仅限于声明的范围。

int CYourClass::foo()
{
    using namespace std;
    list<int>::iterator iter = myListOfInts.begin();
    ...
}
于 2009-06-22T20:57:42.783 回答
2

您通常有三个可接受的选项:

  1. 范围使用(std::Something)
  2. 将 using 放在源文件的顶部
  3. 放在通用头文件中

我认为最普遍接受的最佳实践是使用#1 - 准确显示该方法的来源。

在某些情况下,文件完全依赖于从命名空间中提取内容,因此将 using 命名空间放在源文件的顶部更具可读性。虽然由于懒惰很容易做到这一点,但尽量不要屈服于这种诱惑。至少通过将它放在特定的源文件中,维护代码的人可以看到它。

第三种情况通常是不好的做法。如果您依赖多个外部源文件,这两个文件都可能定义相同的方法,这可能会导致问题。此外,对于维护您的代码的人来说,它会混淆某些声明的来源。应该避免这种情况。

总结: 更喜欢使用范围实例(std::Something),除非过度使用这些实例会降低代码的易读性和可维护性。

于 2009-06-22T21:58:23.910 回答
0

您可以将它放在多个位置 - 每个 .cpp 文件中。

于 2009-06-22T20:58:01.973 回答
0

本质上,您需要做出选择:

1)通过包含using namespace std在所有cpp文件中来“做正确的事”,或者

2)添加using namespace std一些常用的头文件。

不同的人会对哪个最好有不同的看法,但是如果你问我,我会选择放入using namespace std一个共同的标题。在我看来,std命名空间就是这样 - “标准”,任何名称冲突都需要在代码级别解决,而不是依赖命名空间。

于 2009-06-22T20:58:42.003 回答
0

命名空间不会“传播”到其他文件。你必须把它放在每个文件中,或者只是明确地调出你的类。

任何一个:

使用命名空间标准;废话<<x;

或者:

std::blah << x;

选择是一种风格选择,要么在实践中有效。

如果编译器没有“识别”命名空间,那是因为您没有包含声明它的定义文件(即 include )

于 2009-06-22T21:00:40.733 回答
0

using namespace std;仅仅因为这样做对您来说似乎很方便,所以散布代码并不是一个好主意。但是,如果您坚持这样做,您可以将自己的代码包装到该名称空间中。并且只有在稍后您将真正使用主文件中的函数/类时,您才会定义 using namespace std;. 只是为了强调我的意思,这里的例子:

namespace std
{
   class MyNewClass
   {
       public:
             MyNewClass( ) { out << "Hello there" << endl;};
   };
}; 

int main( )
{
    std::MyNewClass tmp;
};
于 2009-06-22T21:04:38.620 回答