【问题标题】:How to use a single namespace across files?如何跨文件使用单个命名空间?
【发布时间】:2009-06-22 20:53:46
【问题描述】:

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

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

这应该怎么做?

【问题讨论】:

  • 不要过度使用“使用命名空间 ” 我更喜欢在标准命名空间中添加前缀 std:: 写起来并不准确!

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案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();
        ...
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 就像我说的,我试过这个并且我得到这个编译器错误:错误 C2871:'std':具有此名称的命名空间不存在它适用于 main.cpp,但不适用于任何其他我的 cpp 文件。
      • 您是否在那些需要 namespace::std 的文件中使用了某些东西?如果你不#include 任何会使用该命名空间的头文件,那么编译器会抱怨,就像你亲身经历过的那样。
      【解决方案4】:

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

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

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

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

      【讨论】:

      • 我建议做正确的事。不要在头文件中放置 任何 usings,而是在 cpp 文件中放宽,以使代码更易于使用
      • 在头文件中放一个 using 命名空间是自找麻烦。
      • 最多放一个“using namespace_name::name;”进入你的源文件。因此,您可以准确控制要显示的内容,如果发生冲突,它们会立即显示在该行。头文件中的任何“使用”都是一个巨大的痛苦。我认为大多数人和所有“大人物”都同意这一点。
      【解决方案5】:

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

      要么:

      使用命名空间标准; 废话

      或:

      std::blah

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 这绝对是回答 Tony R 提出的问题的一种方式,我认为污染外部命名空间不是一个好主意。一般来说,除非你创建了你不应该添加的命名空间。
        猜你喜欢
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        相关资源
        最近更新 更多