什么要求我声明“using namespace std;”?

What requires me to declare "using namespace std;"?

提问人:vette982 提问时间:2/8/2010 最后编辑:Eightvette982 更新时间:6/1/2012 访问量:10074

问:

这个问题可能是重复的,但我找不到一个好的答案。短小精悍,需要我声明

using namespace std;

在 C++ 程序中?

C++ 命名空间 包括 使用 using 指令

评论


答:

22赞 Colin Valliant 2/8/2010 #1

什么都没有,这是避免在该命名空间中的所有内容前加上 std::

评论

13赞 GManNickG 2/8/2010
也被认为是不良做法。
2赞 Hassan Syed 2/8/2010
如果你这样做,全局命名空间是很糟糕的:D
7赞 Potatoswatter 2/8/2010
@GMan,@Hassan:在实现文件中使用它是完全可以的,在头文件中是危险的。为什么大家总是说“不好的做法”?我不想处理我必须到处键入的代码,就像我不想隐式导入任何命名空间一样std::using namespace some_tools;
1赞 Matthieu M. 2/8/2010
这是不好的做法,因为它更有可能引起名称冲突。例如,最好一次导入一个符号。using std::string
5赞 Alexander Gessler 2/8/2010 #2

能够引用命名空间中的成员,而无需显式引用。例如:stdstd::member

#include <iostream>
using namespace std;

...
cout << "Hi" << endl;

与。

#include <iostream>

...
std::cout << "Hi" << std::endl;
3赞 user257111 2/8/2010 #3

首先,这在 C 中不是必需的 - C 没有命名空间。在 C++ 中,命名空间中包含大多数标准库的任何内容。如果不这样做,则必须显式访问命名空间的成员,如下所示:std

std::cout << "I am accessing stdout" << std::endl;
0赞 sud03r 2/8/2010 #4

C++ 标准库中的所有文件都在 std 命名空间中声明其所有实体。
例如:使用 iostream 中定义的
cin,cout

选择:

using std::cout;
using std::endl;
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;

44赞 Péter Török 2/8/2010 #5

由于 C++ 标准已被接受,几乎所有标准库都在 std 命名空间内。因此,如果您不想用 限定所有标准库调用,则需要添加 using 指令。std::

然而

using namespace std;

被认为是一种不好的做法,因为您实际上是在导入整个标准命名空间,从而为名称冲突开辟了很多可能性。最好只导入你在代码中实际使用的东西,比如

using std::string;

评论

0赞 Akay 1/18/2019
我可以在一行中包含来自 std 的多个元素,例如:使用 std::string、std::make_shared;
0赞 Niklas Berglund 2/8/2010 #6

每当使用在命名空间中声明的内容时,都会使用它。C++ 标准库在命名空间 std 中声明。因此,你必须这样做

using namespace std;

除非您想在调用另一个命名空间中的函数时指定命名空间,如下所示:

std::cout << "cout is declared within the namespace std";

您可以在 http://www.cplusplus.com/doc/tutorial/namespaces/ 上阅读更多相关信息。

3赞 goldPseudo 2/8/2010 #7

首先,该指令在 C 中从不需要,因为 C 根本不支持命名空间。using

该指令在 C++ 中实际上从来都不是必需的,因为在命名空间中找到的任何项都可以通过在它们前面加上前缀来直接访问。因此,例如:usingstd::

using namespace std;
string myString;

相当于:

std::string myString;

是否选择使用它是一个偏好问题,但公开整个命名空间以节省一些击键通常被认为是不良形式。仅公开命名空间中特定项的替代方法如下所示:std

using std::string;
string myString;

这样,你就可以只公开命名空间中特别需要的项,而不会无意中公开你不打算公开的内容。std

0赞 user238801 2/8/2010 #8

您永远不必使用命名空间 std 进行声明;使用它是一种不好的做法,你应该使用 std:: 如果你不想键入 std:: always,在某些情况下你可以做这样的事情:

using std::cout;

通过使用 std:: ,您还可以判断程序的哪个部分使用标准库,哪些部分不使用。更重要的是,可能与包含的其他功能存在冲突。

RGDS系列 莱恩

评论

2赞 Porculus 2/8/2010
这只是头文件中全局命名空间中的不良做法。在实现文件中,这通常是一个好主意。保存打字是无关紧要的 -- 你的编辑应该为你做打字。这很好,因为它使代码比随处可见更易读,并且比每个文件顶部有三十行更易于维护。std::using std::whatever;
5赞 Alexandros Gezerlis 2/8/2010 #9

你绝对不应该说:

using namespace std;

在您的 C++ 标头中,因为这超过了使用命名空间的全部意义(这样做会构成“命名空间污染”)。有关此主题的一些有用资源如下:

1) 使用“std”的标准约定上的 stackoverflow 线程

2) Herb Sutter 关于迁移到命名空间的文章

3) 来自马歇尔·克莱恩的 C++ FAQ 精简版的常见问题解答 27.5

1赞 xan 2/8/2010 #10

命名空间是一种包装代码的方法,以避免混淆和名称冲突。例如:

文件 common1.h:

namespace intutils
{
    int addNumbers(int a, int b)
    {
        return a + b;
    }
}

使用文件:

#include "common1.h"    
int main()
{
    int five = 0;
    five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace.
    five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within.

    using namespace intutils;
    five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace.
}

所以,当你写的时候,你要做的就是告诉编译器,如果有疑问,它应该在命名空间中查找函数等,它找不到定义。这通常用于示例(和生产)代码中,因为它使键入常用函数等比必须将每个函数完全限定为 .using namespace stdstdcoutstd::cout

7赞 visitor 2/8/2010 #11

从技术上讲,您可能需要使用 using (对于整个命名空间或单个名称) 才能使用参数相关查找。

请考虑以下两个使用 的函数。swap()

#include <iostream>
#include <algorithm>

namespace zzz
{
    struct X {};


void swap(zzz::X&, zzz::X&) 
{
    std::cout << "Swapping X\n";
}
}

template <class T>
void dumb_swap(T& a, T& b)
{
    std::cout << "dumb_swap\n";
    std::swap(a, b);
}

template <class T>
void smart_swap(T& a, T& b)
{
    std::cout << "smart_swap\n";
    using std::swap;
    swap(a, b);
}

int main()
{
    zzz::X a, b;
    dumb_swap(a, b);
    smart_swap(a, b);

    int i, j;
    dumb_swap(i, j);
    smart_swap(i, j);
}

dumb_swap总是调用 - 即使我们更愿意使用 for 对象。std::swapzzz::swapzzz::X

smart_swap作为回退选项可见(例如,当使用 int 调用时),但由于它没有完全限定名称,因此将通过 ADL 用于 .std::swapzzz::swapzzz::X


主观上,迫使我使用的是编写使用各种标准函数对象等的代码。using namespace std;

//copy numbers larger than 1 from stdin to stdout
remove_copy_if(
    std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
    std::ostream_iterator<int>(std::cout, "\n"),
    std::bind2nd(std::less_equal<int>(), 0)
);

IMO,在这样的代码中只会产生线路噪声。std::

在这种情况下,如果它被用于实现文件,我不会发现令人发指的罪行(但它甚至可以限制在函数范围内,就像在交换示例中一样)。using namespace std;

绝对不要将 using 语句放在头文件中。原因是这会污染其他标头的命名空间,这些标头可能包含在有问题的标头之后,这可能会导致其他标头中的错误,而这些错误可能不受您的控制。(这也增加了一个令人惊讶的因素:包括文件的人可能不希望看到所有类型的名称。

0赞 Alexander Poluektov 2/8/2010 #12

不需要你做任何事情 - 除非你是C++标准库的实现者,并且你希望在以“新”和“旧”样式声明头文件时避免代码重复:

// cstdio
namespace std
{
  // ...
  int printf(const char* ...);
  // ...
}

.

// stdio.h
#include <cstdio>
using namespace std;

当然,示例有点做作(你同样可以使用plain并将其全部放在std in中),但是Bjarne Stroustrup在他的C++编程语言中展示了这个示例。<stdio.h><cstdio>