14

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

4

7 回答 7

15

在函数内部添加它会将 using 语句的范围仅限于该函数。你不应该在头文件中放置一个using语句,以避免与你的头文件的用户发生冲突。

如果您知道不会出现冲突,则将其放在文件范围内的 main 之上是可以的,但即使这样也可能导致其他导入类型出现问题,并且通常在中等规模的项目中应避免使用。我尽量避免对全局命名空间的污染,但如果我正在编写一次性的小型实现文件using namespace std;,为了方便起见,我会在顶部添加一个。

在你的情况下,假设你只想使用std::coutand std::cin(只是一个例子),你可以这样做:

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

现在您可以编写cin >> whatever并且cout << whatever无需每次都完全限定类型/对象,并且还可以避免污染全局命名空间。

于 2011-06-24T23:36:45.367 回答
13

你把它放在哪里会有很大的不同。

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

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

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

一般来说,在头文件的全局范围内使用它是非常糟糕的做法,而在全局范围内使用它是半坏的做法,因为在Unity 构建中,头文件和源文件之间的区别是模糊的。

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

于 2011-06-24T23:37:38.467 回答
7

一般来说(当然在大型项目中),最好不要使用它

于 2011-06-24T23:36:27.467 回答
6

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

于 2011-06-24T23:36:55.853 回答
2

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

void some_function()
{
  using std::vector;

  vector<int> x;
  ...
}

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

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

于 2011-06-24T23:39:39.397 回答
0

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

于 2011-06-24T23:38:07.477 回答
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..
于 2011-06-24T23:44:04.653 回答