【问题标题】:Usage of namespaces in c++c++中命名空间的使用
【发布时间】:2011-03-13 18:15:36
【问题描述】:

我们可以像下面的 sn-p 那样使用命名空间吗?代码在 gcc 和 msvc 中编译,让我对命名空间的使用感到困惑。

在 f1.h 中:

命名空间我的 { 无效的富(); }

在 f1.cpp 中 `

无效我的::foo() { }

我认为函数应该定义为:

命名空间我的{ 无效 foo() {} }

谁能解释一下?

谢谢

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

    和做的一样:using std namespace;在顶部,只是做 cout 而不是做 std::cout。两者都可以工作并且都是有效的,但你必须考虑如何使用它们。有利有弊。

    【讨论】:

      【解决方案2】:

      我喜欢这是允许的:

      namespace My
      {
       void foo();
      }
      

      因为这意味着如果实用程序方法很长,它不会弄乱头文件。这样命名空间中提供了哪些方法就更明显了。

      我知道这对于现代 IDE 的表现力来说可能是一个零点,但它仍然有助于拥有干净的头文件。

      【讨论】:

        【解决方案3】:

        在其命名空间之外定义命名空间成员是合法的,只要它们的名称以其命名空间的名称为前缀,并且定义实际上发生在包含它的命名空间中。它不会发生在嵌套在成员命名空间内的命名空间中。

        namespace A { void f(); }
        void A::f() { } // prefix with "A::"
        
        namespace B { }
        void B::f() { } // invalid! not declared in B!
        
        namespace C { void f(); }
        namespace D { void C::f() { } } // invalid! D doesn't enclose C
        
        namespace E {
          void f();
          namespace F {
            void E::f() { } // invalid! F is nested inside E!
          }
        }
        

        这与类成员相同,您也可以在其类之外定义函数,只要在名称前加上类名即可。然而,对于类,命名空间成员必须首先在它们各自的命名空间中声明,然后才能在其外部定义。

        【讨论】:

        • @Philipp 我直接就地定义了内联函数,其他函数分别定义。特别是如果有头文件/实现文件分离。
        • 这不是重言式吗?在类定义中定义的函数始终是内联的。我的意思是是否使用A::fnamespace A { f } 定义独立函数。至少 Boost 似乎更喜欢后者。
        • 但是,@Philip 函数直接在命名空间中定义,不会自动内联。当然,现在您可能会问我何时将函数内联。好吧,如果它足够短,我将其设为内联函数,然后直接就地定义它。 Boost 对库的指定目标是让它们仅包含标头,因此它们从内联定义其函数中受益匪浅(然后,除了依赖问题之外,几乎没有理由稍后在文件中定义它)。
        【解决方案4】:

        两个都是真的

        您可以全局设置命名空间或为每个函数设置命名空间

        namespace My {
        //in this are functions are in "My" namespace
        }
        
        namespace Your {
        //in this are functions are in "Your" namespace
        }
        

        My::foo() {}
        My::bar() {}
        Your::foo() {}
        

        如果你不想在每个函数的开头写“My::”,你把它写成第一个。第二个在有多个命名空间时很有用

        【讨论】:

          【解决方案5】:

          是的,没关系。通过执行“My::”,您表明您正在使用“My”命名空间。

          与将 STL 向量声明为 "std::vector" 的方式相同 ...

          【讨论】:

            猜你喜欢
            • 2011-07-15
            • 2014-07-17
            • 2019-08-03
            • 1970-01-01
            • 1970-01-01
            • 2011-01-02
            • 2011-05-05
            • 1970-01-01
            相关资源
            最近更新 更多