c++ - 我应该在源文件中包含包含命名空间定义的标题吗?
问题描述
如果我在头文件和某些源文件中定义了一个名称空间,我不包含该头文件,而是定义一个名称空间与头文件中的名称相同,并声明与头文件中相同的成员,然后添加定义那么我是定义一个新的命名空间还是打开现有的命名空间?
//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.cpp
我bar.cpp
没有包含file.h
包含命名空间定义的标头mylibNS
!那么在这些源文件中,我是打开一个现有的命名空间还是在每个文件中定义一个新的命名空间?该程序工作得很好,所以我应该这样做还是坚持标准(打开命名空间并添加到它)?我应该包括
file.h
在foo.cpp
andbar.cpp
和中main.cpp
吗?
解决方案
通常的做法是file.h
在任何需要foo
或bar
需要的文件中包含并删除重复的声明。然后,如果一个函数的签名发生变化(或者如果添加了一个新函数),它只需要在一个地方进行更改。它还避免了在两个不同的地方用两个不同的签名声明一个函数的危险。
推荐阅读
- ios - Firebase Crashlytics 未显示仪表板/控制台 iOS 应用中的更改
- python - PYTHON 3 - 如何抓取受密码保护的网站?
- tensorflow - 矩阵大小不兼容:In[0]: [32,6], In[1]: [128,1][[node gradient_tape/sequential/dense_1/MatMul
- svg - SVG 蒙版不适用于多个变换
- julia - 创建一个行为类似于另一个类型的原始类型
- ios - 具有集合视图布局的可切换集合视图
- javascript - 在 c# MVC5 中使用 DotNetZip 下载 zip 文件
- ios - Xamarin.Forms 对于生产 macOS 应用程序是否稳定?
- objective-c - NSDateFormatter 将午夜显示为 24 而不是 00
- java - 指定无效日志级别时如何在 slf4j logback.xml 中设置默认日志级别