【问题标题】:C++ Namespace around header declaration and source definition标头声明和源定义周围的 C++ 命名空间
【发布时间】:2012-10-05 10:17:05
【问题描述】:

我正在制作一个静态库,其中定义的所有内容都在一个命名空间中。但我不确定我是否应该像定义一个类一样定义方法,或者也将它们包装在命名空间中。我要问的是:

这是否有效:

MyThings.h

namespace MyThings {
    void DoStuff();
    void DoOtherStuff();
}

MyThings.cpp

namespace MyThings {
    void DoStuff() {
        // Do this.
    }

    void DoOtherStuff() {
        // Do that.
    }
}

或者,我应该像定义类方法一样定义它吗?:

MyThings.cpp

void MyThings::DoStuff() {
    // Do this.
}

void MyThings::DoOtherStuff() {
    // Do that.
}

我宁愿不使用using namespace MyThings;,如果它是有效的,我宁愿使用我的第一个示例,我觉得它使代码更具可读性,而不必在每个方法标识符之前使用MyThings::

【问题讨论】:

标签: c++ namespaces coding-style declaration


【解决方案1】:

两者都是有效的,因此您可以根据口味选择自己的风格。

使用以下方式定义函数有一个明显的优势:

void MyThings::DoStuff() {
    // Do this.
}

也就是说,为了做到这一点,函数必须已经被声明。因此,错误如下:

void MyThings::DoStuf() {
    // Do this.
}

void MyThings::DoStuff(int i) {
    // Do this.
}

在编译 MyThings.cpp 时被捕获。如果你定义

namespace MyThings {
    void DoStuff(int i) {
        // Do this.
    }
}

那么在另一个源文件中的某个人尝试调用该函数并且链接器抱怨之前,您通常不会收到错误消息。显然,如果您的测试是非垃圾测试,您会以一种或另一种方式捕获错误,但通常越快越好,并且您可能会从编译器获得比链接器更好的错误消息。

【讨论】:

  • +1 表示“必须已声明”。出于某种奇怪的原因,我从来没有想过。
  • +1。很好的答案,回答了这个问题,并告诉我使用我想要的方式来定义命名空间中的函数的含义。我也从来没有想过。
  • +1 关于链接时间错误的要点。我什至没有考虑过。
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 2011-09-20
  • 2020-12-03
  • 1970-01-01
  • 2011-03-02
  • 2021-11-09
相关资源
最近更新 更多