C++ 标头声明和源定义周围的命名空间

C++ Namespace around header declaration and source definition

本文关键字:定义 周围 命名空间 声明 C++      更新时间:2023-10-16

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

这是否有效:

MyThings.h

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

我的东西.cpp

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

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

我的东西.cpp

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

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

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

使用以下命令定义函数有一个宣传的优势:

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.
    }
}

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