使用命名空间std; 在头文件(using namespace std; in a header

2019-07-18 22:00发布

所以,我有一个规范文件以下

#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; 在每个文件,编译器将不知道哪去了什么。 真的吗?

我大致明白是清楚的是一个“好”的事情,不过,我在如何特异性有点不清楚,我最感兴趣的是更深层次的“为什么”,强调它所有。

所以我直接的问题是,在我的例子提供,什么是“最清晰”的方式来描述的功能既为编译器和行业“标准”? 而且,您可以直接我更清楚地描绘了推理和命名空间的实际执行资源。

Answer 1:

比方说,我声明一个类string自己。 因为我是一个懒惰的混混,我在全局命名空间中这样做。

// Solar's stuff
class string
{
    public:
        string();
        // ...
};

一段时间后,我意识到,重新使用一些你的代码将有利于我的项目。 感谢您使它开源,我可以这样做:

#include <solarstuff.hpp>
#include <phoenixstuff.hpp>

string foo;

但突然间,编译器不喜欢我了。 因为有一个::string (我的班级)和其他 ::string (标准之一,通过你的头包含并使其与全局命名空间using namespace std;还有各种疼痛可拿。

更糟的是,这个问题得到通过每一个包括我的头文件提升(包括你的头,这......你的想法。)

是的,我知道,在这个例子中,我也有责任不保护我自己的类,在我自己的命名空间,但是这就是我想出了特设的一个。

命名空间是有,以避免标识符冲突。 你的头不仅引进MyStuff到全局命名空间,而且从每一个标识stringfstream 。 没准他们大多是从来没有真正通过我们双方的需要,那么为什么它们拖动到全球,污染环境?

另外:从维护编码器/调试程序的视图, foo::MyStuff是十倍更方便MyStuff ,namespace'd别的地方(可能甚至不是同一个源文件),因为你在点获得命名空间的信息就在那里在代码在你需要它。



Answer 2:

的多个实例using namespace std; 不会造成任何歧义。 问题是,这种说法进口的所有名称/类型/功能std到您的命名空间,现在如果你希望把一个类string ,例如,你会打麻烦。 这很可能是与像删除,擦除等功能发生

在标题使用的是一个水平更差 ,因为传播到所有.cpp这个头S,没有人,包括它的意识。 在使用它.cpp ATLEAST需要有意识的选择。

一个更完整的解释可在拿到为什么“使用命名空间std”被认为是不好的做法?

可能会导致这种问题的一个例子中可以找到如何使用迭代器? 其中OP定义一个函数distance ,并保持得到错误的答案。 在另一实例中 大约用C指针和引用混乱++



Answer 3:

命名空间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 ++编码规则



文章来源: using namespace std; in a header file