在哪里使用命名空间std;

时间:2011-06-24 23:33:18

标签: c++ namespaces using-directives

我想知道把using namespace std;放在哪里。我在using namespace std;中看到了int main(){}的代码,但我将其放在#include <iostream>之后。我应该把它放在哪里,它在我把它放在哪里有什么不同?

7 个答案:

答案 0 :(得分:14)

在函数内添加它只会将using语句的范围限制为该函数。您不应该在标头内放置using语句,以避免头文件用户发生冲突。

如果您知道不会发生冲突,那么将它置于文件范围的主要位置就可以了,但即使这样也可能导致其他导入类型出现问题,并且通常在中等大小的项目中要避免。我尽量避免污染全局命名空间,但如果我正在编写一个一次性的小实现文件,我会在顶部添加using namespace std;以方便使用。

在您的情况下,假设您只想使用std::coutstd::cin(仅举例),您可以这样做:

using std::cout;
using std::cin;

现在,您可以在不完全限定类型/对象的情况下编写cin >> whatevercout << whatever,并且还可以避免污染全局命名空间。

答案 1 :(得分:11)

你把它放在巨大的区别。

如果你把它放在一个函数中,那么它只适用于那个函数。

如果将它放在全局范围内的函数之外,则它适用于该点之后的所有内容。

如果将它放在头文件中的全局范围内的函数之外,它甚至会应用于包含该标题的ever文件。

一般来说,在标题中将它用于全局范围是非常糟糕的做法,而在全局范围内使用它是半坏的做法,因为在Unity builds中,标题和源文件之间的区别是模糊的。< / p>

您最好只在您需要的函数中使用它,甚至根本不使用它,只需在标准库函数/类前加std::

答案 2 :(得分:6)

一般情况下(尤其是在大型项目中),最好not to use it at all

答案 3 :(得分:6)

using指令是作用域的,所以它只在它出现的范围内有效。在适合您情况的任何地方使用它。

答案 4 :(得分:2)

如果你不喜欢在任何地方输入std ::(我这样做,在我的代码中找不到足够的双冒号!),最佳做法是选择性地将你想要的名字导入范围,如下所示:

void some_function()
{
  using std::vector;

  vector<int> x;
  ...
}

在全球范围内也可以use选择名称。

这样,您就不会将标准库中的所有名称都拉到全局名称空间中。

答案 5 :(得分:0)

无论你把它放在哪里,它都会将std中的所有内容都放入范围。如果它在文件范围内,它在文件中的任何位置计数,如果它在函数中,它只适用于函数 - 所以它取决于你想要的。就个人而言,我不喜欢声明using namespace std

答案 6 :(得分:0)

很多人会说你根本不应该使用它。原因是如果你不小心定义了一个已经存在于std命名空间中的函数,可能会有冲突,对于非常大的项目,这可能很难被追踪。对于琐碎的程序来说,老实说这不是一个大问题,但是你把它放在哪里确实有所作为。

在全球范围内,它适用于所有地方。在本地范围内(即仅在main()中),它仅适用于main。

以下是一些替代方案

  • 在所有内容之前放置std :: std::cout << "Hello, World!" << std::endl;
  • 仅在功能中使用您想要的特定内容。

在本地函数中仅使用所需内容的示例:

int main()
{
   using std::cout;
   using std::endl;
   cout << "Hello, World!" << endl;
   return 0;
} // Obviously you need #include <iostream> at the top..