如何跨文件使用单个命名空间?

时间:2009-06-22 20:53:47

标签: c++ visual-c++ namespaces std

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

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

应该怎么做?

6 个答案:

答案 0 :(得分:2)

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

#include <list>

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

您可以继续完全符合cpp

中的任何功能
int CYourClass::foo()
{
    std::list<int>::iterator iter = myListOfInts.begin();
    ...
}

你真的不需要在任何地方“使用命名空间std”。只有当你发现你输入的std ::太多时,才会抛出“使用命名空间std”以保存自己的击键并提高代码的可读性。这将仅限于声明的范围。

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

答案 1 :(得分:2)

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

  1. 范围用法(std :: Something)
  2. 在源文件的顶部使用
  3. 使用公共头文件
  4. 我认为最常被接受的最佳做法是使用#1 - 准确显示方法的来源。

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

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

    <强>要点: 更喜欢使用作用域实例(std :: Something),除非过度使用这些实例会降低代码的易读性和可维护性。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

2)在一些常见的头文件中添加using namespace std

不同的人会有不同的意见,但如果你问我,我会选择将using namespace std放在一个共同的标题中。在我看来, std 命名空间只是 - “标准”,任何名称冲突都需要在代码级别解决,而不是依赖于命名空间。

答案 4 :(得分:0)

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

或者:

使用命名空间std; blah&lt;&lt; X;

或:

std :: blah&lt;&lt; X;

选择是一种风格选择,或者在实践中起作用。

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

答案 5 :(得分:0)

传播代码using namespace std;并不是一个好主意,因为这样做似乎很方便。但是如果你坚持它,你可以将自己的代码包装到该名称空间中。只有在您实际上将在主文件中使用您的函数/类时,您才会定义using namespace std;。只是为了强调我说的,这里的例子是:

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

int main( )
{
    std::MyNewClass tmp;
};