当我使用“使用std :: cout;”等时仍然被认为是不好的做法?

时间:2018-06-08 08:59:17

标签: c++ namespaces

使用

的原因很明显
using namespace std;

被认为是不好的做法。因为我对C ++很新(大概8个月了),我想知道当我使用

时它仍然被认为是不好的做法
using std::cout;
using std::cin;
using std::endl;

等等只包括我需要的内容而不是包含整个命名空间。我的老教师总是告诉我们不要使用它,但我的新老师告诉我们,使用using - 声明与包含整个命名空间相比,这很好。

你使用了什么,你认为这是一种不好的做法吗?

我希望这个问题不是重复,但我没有找到这样的问题,只是关于 为什么 的问题被认为是使用 using namespace std; 的不良做法,但如上所述,我已经知道了。

1 个答案:

答案 0 :(得分:1)

我不喜欢我原来的答案,太罗嗦了,所以这里有一个更好的重写。
Here's a good answer on why using namespace is bad.

考虑到这个答案,如果库 Foo 具有函数 kept 并且 Bar 具有函数 lept。使用 2 个 using 指令,您可以在没有作用域的情况下使用 keptlept。如果 Foo 决定更新并添加函数 lept,那么您选择的编译器要么会出错,要么会出现未定义的行为*。如果您使用 using Foo::keptusing Bar::lept,那么在 Foo 上添加 lept 的更新不会导致任何错误,您可以使用 Foo::lept 调用该新功能。它也被认为是使用指令的正确形式,而不是在全局范围内使用它们。 Rather, for each function that you want to use a using-directive, redefine it。使用 using std::cout 等是不错的做法,并且在某些情况下,允许快速更改库。例如,我正在使用 JSON 解析库。为了测试它们,我在程序的开头添加了 using json = LIBRARY::json 行,如果我不喜欢我拥有的库,我可以快速更换它们。

*例如,如果 Barlept 定义为 double lept(double, double),但 Foolept 定义为 int lept(int, int),则调用to lept 与 2 int 输入将调用 Foo::lept 或在编译时给出错误。这意味着在您测试之前,您不会知道您的程序中存在大量错误。