用"using"引用特定项目是否是一种好的做法?

Is it a good practice to refer to a particular item with "using"?

本文关键字:一种 引用 using 项目 是否是      更新时间:2023-10-16

例如,我知道我只需要代码中 std 命名空间中的"cout",所以我将其称为:

using std::cout;

所以我可以自由地使用它作为:

cout << "Using namespaces like a boss!" << std::endl;

而不是将整个命名空间带到我的代码中。

我非常习惯于键入所有前缀 std 的内容,因为我被告知使用命名空间是一种不好的做法,因为它可以与其他命名空间中的其他函数交叉(幸运的是,对我来说并非如此,我仍在学习编码,我在职业生涯的第二学期(,但不是在所有内容前面加上 std, 我想做"使用 std::cout"和其他类似的事情,这样我就可以提高代码的可读性,这对我以后在某个时间点理解我的代码很重要。

普遍将

事物标记为"不良做法"以代替讨论真正的问题和权衡是一种不好的做法。

有些技术可能很糟糕,经常被滥用。using,尤其是using namespace指令可能会被滥用,所以千篇一律的心态就是说它们在某种程度上是"坏的"。

在单个.cpp文件中,您可以更好地控制命名空间,因此只要冲突的机会是可管理的并且可读性有所提高,就可以在文件范围甚至using namespace my_funny_namespace using std::cout。在某些时候,也许如果.cpp文件变得复杂,您将面临以下风险:将新名称添加到与您的名称之一冲突some_funny_namespace中,并且using namespace some_funny_namespace会带来会破坏代码的内容。但对于像 boost 或 std 这样稳定的东西,这可能不太可能。

还可以按函数在本地使用using。但是,如果文件中的大多数函数需要相同的声明,则 D.R.Y.

当你在标题中使用其中任何一个时,它可以越界变成一件非常糟糕的事情。然后,您将名称从另一个命名空间泄漏到包含标头的每个文件中。请参阅此精彩答案以获取替代方案和讨论。这真的很糟糕,因为当包含或不包含标头会导致一些完全不相关的问题出现或消失时,它可能会导致幽灵般的远距离操作错误。而且可能破坏的不仅仅是"你的"代码,它可能会破坏其他人使用你的标题的代码。

不要将名称泄漏到其他命名空间中

那么using,尤其是标题中的using namespace是verbotten?如果标头在一组选定的.cpp文件中供内部使用怎么办?然后,也许没关系。这就是千篇一律的规则的问题,总有一个例外,无缘无故地让一些假设的事情变得更糟,但最佳实践是可怕的。

using的好处是可读性(不应被低估(。

缺点是名称冲突的可能性,尤其是在其他一些随机代码中不可预测的名称冲突。

明智地选择。仔细考虑设计的各个方面是一种很好的做法。

(问好问题也不算太糟糕(。

using namespace :: identifier ;是语言的一部分,因为在某些程序中它很有帮助。 您正在平衡简洁性和灵活性与脆弱性,但可能发生的最坏情况是,您必须通过消除您指的是哪个cout对象的歧义来解决编译器错误。 如果您只是使用大型命名空间中的少数标识符,则具有目标using语句通常是一个合理的折衷方案;如果列表开始变得过大,那么using namespace std;可能会变得更容易。

两者都不应该在库头文件的文件范围内使用,因为它们会对翻译单元的其余部分保持影响,并破坏客户端程序。

限制范围内,在实现文件(.cpp.cc或你使用的任何扩展名(中,你基本上可以尝试using并根据需要修复歧义 - 你将了解什么最适合你。

using std::begin;using std::end;是特别有用的using语句的很好的例子,因为它们允许begin(my_container)在后者对my_container有重载时匹配std::begin(),但如果my_containerbegin实际上在容器声明的任何命名空间中,由于参数依赖查找,begin()仍然可以匹配。

提示:通常最好写[std::]cout << "Using namespaces like a boss!n"; - 更简洁,为什么要强制刷新? 它往往会降低性能,并且coutcin相关联,因此在需要时会进行刷新以提示用户输入。

相关文章: