c – 使用命名空间std;在头文件中
作者:互联网
所以,我在规范文件中有以下内容
#include <string>
#include <fstream>
using namespace std:
class MyStuff
{
private:
string name;
fstream file;
// other stuff
public:
void setName(string);
}
我也在实现文件中
#include "MyStuff.h"
using namespace std;
void MyStuff::setName(string name);
{
name = name
}
在程序文件中我有……
#include <iostream>
#include <string>
using namespace std;
void main()
{
string name;
MyStuff Stuff;
cout << "Enter Your Name: ";
getline(cin, name);
Stuff.setName(name);
}
我正在收集应用“using namespace std;”在头文件中是禁止的,完全符合条件是“更好”的做法;例如std :: cout<<东西<< ENDL; 我的理解是,为了使用字符串,它必须具有std命名空间.真的吗? 如果是这样,在头文件中,更加“纯净/干净”来做…
#include <string>
class MyStuff
{
std::string name;
}
而且,据我所知,目前使用命名空间std;在所有三个文件,规范,实现和程序中,基本上将三个命名空间层叠在一起,所以如果我单独声明字符串名称;在每个文件中,编译器都不知道哪个去了什么.真的吗?
我一般都明白,明确是一个“好”的事情,但我对如何的特殊性有点不清楚,而且我最感兴趣的是更深层次的“为什么”这一点.
所以我的直接问题是,在我提供的示例中,描述编译器和行业“标准”功能的“最清晰”方式是什么?而且,您能否指引我更清楚地描述名称空间的推理和实际实现的资源.
解决方法:
假设我自己声明了一个类字符串.因为我是一个懒惰的流浪汉,我在全局命名空间中这样做.
// Solar's stuff
class string
{
public:
string();
// ...
};
一段时间后,我意识到重新使用一些代码会使我的项目受益.感谢您将其设为开源,我可以这样做:
#include <solarstuff.hpp>
#include <phoenixstuff.hpp>
string foo;
但突然之间,编译器不再喜欢我了.因为有一个:: string(我的类)和另一个:: string(标准的,包含在你的头文件中并使用命名空间std带入全局命名空间),所以有各种各样的痛苦.
更糟糕的是,这个问题通过包含我的标题的每个文件得到提升(包括你的标题,哪个……你明白了.)
是的,我知道,在这个例子中,我也应该责怪我自己的命名空间中没有保护自己的类,但那是我提出的ad-hoc.
命名空间用于避免标识符的冲突.您的标头不仅将MyStuff引入全局命名空间,还将字符串和fstream中的每个标识符引入.我们中的任何一个人实际上都不需要它们中的大多数,所以为什么要将它们拖入全球,污染环境?
另外:从维护编码器/调试器的角度来看,foo :: MyStuff比MyStuff方便十倍,命名空间在其他地方(可能甚至不是同一个源文件),因为你在那里获得了名称空间信息在你需要它的代码中.
标签:c,class,header-files,namespaces 来源: https://codeday.me/bug/20190917/1808757.html