我应该在源文件中包含包含命名空间定义的标头吗?

时间:2021-03-22 23:13:59

标签: c++ namespaces

如果我在头文件和一些源文件中定义了一个命名空间,我不包含该头文件,而是定义一个与头文件中名称相同的名称空间,并声明与头文件中相同的成员然后添加定义,那么我是定义一个新的命名空间还是打开现有的命名空间?

//file.h
#ifndef FILE_H_INCLUDED
#define FILE_H_INCLUDED

namespace mylibNS{
    void foo();
    void bar();
}

#endif // FILE_H_INCLUDED

// foo.cpp
#include <iostream>
//#include "file.h"

namespace mylibNS{
    void foo();
}

void mylibNS::foo(){
    std::cout << "foo()\n";
}

// bar.cpp
#include <iostream>
// #include "file.h"

namespace mylibNS{
    void bar();
}

void mylibNS::bar(){
    std::cout << "bar()\n";
}

// main.cpp
#include <iostream>
using namespace std;
#include "file.h"

int main(int argc, char* argv[]){

    mylibNS::bar();
    mylibNS::foo();
}
  • 上面的代码运行良好,尽管在源文件 foo.cppbar.cpp 中我没有包含包含命名空间 file.h 定义的头 mylibNS!那么在这些源文件中,我是打开一个现有的命名空间还是在每个文件中定义一个新的命名空间?该程序运行良好,所以我应该这样做还是坚持标准(打开命名空间并添加到其中)?

  • 我应该在 file.hfoo.cppbar.cpp 中包含 main.cpp 吗?

2 个答案:

答案 0 :(得分:3)

通常的做法是在任何需要 file.hfoo 的文件中包含 bar 并删除重复的声明。然后,如果一个函数的签名发生变化(或者如果添加了一个新函数),它只需要在一个地方进行更改。它还避免了在两个不同的地方用两个不同的签名声明一个函数的危险。

答案 1 :(得分:2)

<块引用>

我应该在源文件中包含包含命名空间定义的标头吗?

从技术上讲,包含头文件与将该文件的内容复制到另一个文件中是一回事,因此完全可以在不使用任何头文件的情况下编写程序。我建议你不要那样做。

在多个翻译单元中使用的每个声明,都应该在头文件中声明,并包含在使用该声明的每个翻译单元中。

<块引用>

所以在这些源文件中我是否打开了一个现有的命名空间

在不同翻译单元中具有相同名称的命名空间是相同的命名空间。只有匿名命名空间对于声明它的翻译单元是唯一的。