所以,我有一个规范文件以下
#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);
}
而我收集,申请“使用命名空间std;” 在头文件是一个没有没有,这完全限定的是“更好”的做法; 如std::cout << stuff << endl;
这是我的理解是,为了使用一个字符串,它必须有std命名空间。 真的吗?
如果是这样,在头文件中,更多的是“纯/清洁”做的...
#include <string>
class MyStuff
{
std::string name;
}
而且,据我所知目前,使用命名空间std; 在所有三个文件,规范,实施和程序,基本层在彼此顶部的三个命名空间,所以如果我单独声明string name;
在每个文件,编译器将不知道哪去了什么。 真的吗?
我大致明白是清楚的是一个“好”的事情,不过,我在如何特异性有点不清楚,我最感兴趣的是更深层次的“为什么”,强调它所有。
所以我直接的问题是,在我的例子提供,什么是“最清晰”的方式来描述的功能既为编译器和行业“标准”? 而且,您可以直接我更清楚地描绘了推理和命名空间的实际执行资源。
比方说,我声明一个类string
自己。 因为我是一个懒惰的混混,我在全局命名空间中这样做。
// Solar's stuff
class string
{
public:
string();
// ...
};
一段时间后,我意识到,重新使用一些你的代码将有利于我的项目。 感谢您使它开源,我可以这样做:
#include <solarstuff.hpp>
#include <phoenixstuff.hpp>
string foo;
但突然间,编译器不喜欢我了。 因为有一个::string
(我的班级)和其他 ::string
(标准之一,通过你的头包含并使其与全局命名空间using namespace std;
还有各种疼痛可拿。
更糟的是,这个问题得到通过每一个包括我的头文件提升(包括你的头,这......你的想法。)
是的,我知道,在这个例子中,我也有责任不保护我自己的类,在我自己的命名空间,但是这就是我想出了特设的一个。
命名空间是有,以避免标识符冲突。 你的头不仅引进MyStuff
到全局命名空间,而且从每一个标识string
和fstream
。 没准他们大多是从来没有真正通过我们双方的需要,那么为什么它们拖动到全球,污染环境?
另外:从维护编码器/调试程序的视图, foo::MyStuff
是十倍更方便MyStuff
,namespace'd别的地方(可能甚至不是同一个源文件),因为你在点获得命名空间的信息就在那里在代码在你需要它。
的多个实例using namespace std;
不会造成任何歧义。 问题是,这种说法进口的所有名称/类型/功能std
到您的命名空间,现在如果你希望把一个类string
,例如,你会打麻烦。 这很可能是与像删除,擦除等功能发生
在标题中使用的是一个水平更差 ,因为传播到所有.cpp
这个头S,没有人,包括它的意识。 在使用它.cpp
ATLEAST需要有意识的选择。
一个更完整的解释可在拿到为什么“使用命名空间std”被认为是不好的做法?
那可能会导致这种问题的一个例子中可以找到如何使用迭代器? 其中OP定义一个函数distance
,并保持得到错误的答案。 在另一实例中 大约用C指针和引用混乱++
命名空间usings是为了您的方便,不是给你造成别人: 不要写一个使用声明或使用指令#include指令之前。
推论:在头文件,不使用指令或使用声明写命名空间层次; 相反,明确命名空间,所有符合条件的名字。 (第二条规则从第一以下,因为头可以永远不知道什么其他头的#includes可能后他们显得)。
我大致明白是清楚的是一个“好”的事情,不过,我在如何特异性有点不清楚,我最感兴趣的是更深层次的“为什么”,强调它所有。
下面的代码片段反映了为何使用using namespace
中的头文件是坏的:
// snippet 1
namespace A {
int f(double);
}
// snippet 2
namespace B {
using A::f;
void g();
}
// snippet 3
namespace A {
int f(int);
}
// snippet 4
void B::g() {
f(1); // which overload is called?
}
因此,在你的榜样,只要这个人是更好的:
#include <string>
class MyStuff
{
std::string name;
};
推荐书: C ++编程规范:101条规则,准则和最佳实践
和链接: 谷歌C ++编码规则