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



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

//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中,我没有包含包含命名空间mylibNS定义的头file.h,但上面的代码运行良好!那么,在这些源文件中,我是打开一个现有的命名空间,还是在每个文件中定义一个新的命名空间?这个程序运行得很好,所以我应该这样做还是坚持标准(打开名称空间并添加到其中(?

  • 我应该在foo.cppbar.cppmain.cpp中包括file.h吗?

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

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

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

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

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

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

最新更新