【问题标题】:C++ - Explicit & Implicit Namespace Implementation DifferencesC++ - 显式和隐式命名空间实现差异
【发布时间】:2020-06-22 22:14:21
【问题描述】:

如果有人能启发我,我有一个关于命名空间的问题:D

不知道标题对不对,希望如此xD

“.cpp”文件中的代码称为命名空间的实现,“.h”文件中的代码称为命名空间声明?对? :/

无论如何,我的问题是:

命名空间成员的显式或隐式实现有什么区别(在“.cpp”文件中)?

我的意思是,假设我在“MyNamespace.h”中有这个命名空间:

namespace MyNamespace {

    void fun_one(int a);

    void fun_two(int b);

}

如果在“MyNamespace.cpp”中执行此操作(隐式实现),则有任何区别

namespace MyNamespace {

    void fun_one(int a){
        // CODE HERE...
    }

    void fun_two(int b){
        // CODE HERE...
    }

}

this(显式实现)

void MyNamespace::fun_one(int a){
    // CODE HERE...
}

void MyNamespace::fun_two(int b){
    // CODE HERE...
}

?

非常感谢你:D

祝你有美好的一天和美好的编码! (:

【问题讨论】:

  • 这可能是见仁见智。 IMO,最好使用第一种方法。它避免了不必要的命名空间名称的重复输入。

标签: c++ namespaces explicit-implementation


【解决方案1】:

总的来说,你展示的两个版本没有区别,你可以使用任何你喜欢的版本。

对于它的价值,这里有一个略有不同的案例:

namespace A 
{ 
  struct S{};
  S f();        // declare f
}

然后:

namespace A 
{
  S f() { return S{}; }   // define f, ok
}

很好,但以下不是:

S A::f() { return S{}; }

因为S是在引入命名空间A之前使用的。这可以通过以下方式解决:

A::S A::f() { return S{}; }

auto A::f() -> S { return S{}; }

【讨论】:

    【解决方案2】:

    ...称为命名空间的实现 ... 命名空间的声明 ...

    不。命名空间只是...范围名称。它们没有像函数那样独特的声明和实现。

    您拥有的是两个函数的声明,然后是这两个函数的定义。函数有名称,这些名称由包含的命名空间作用域,但与名称在文件范围内的函数没有什么不同。

    您选择哪种语法来引用这些函数,以及它们的作用域名称——即使在函数定义中——就是这样,语法。它只影响代码的外观,对它的作用没有影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多