2015-12-21 116 views
2

例如,我知道我只需要“COUT”从我的代码std命名空间,所以我把它称为:用“使用”来引用特定项目是否是一种很好的做法?

using std::cout; 

因此,我可以自由地使用它作为:

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

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

我非常习惯使用命名空间来告诉我前面所提到的std,因为它可以与其他命名空间中的其他函数进行交叉(好在,对我而言,情况并非如此,我仍然在学习代码,而且我正处于职业生涯的第二个学期),但是我不想在所有事情上都预先标记std,而是想用“std :: cout”和其他类似的东西来提高可读性在我的代码中,这对于我稍后在某个时间点理解我的代码非常重要。

+0

不是语法只是'使用std :: cout;'? '如果'std :: cout'是一个命名空间,那么使用命名空间std :: cout;'会用于命名空间。 – user2357112

+0

'使用命名空间std :: cout;'不会编译,因为'cout'不是一个命名空间。因此,我怀疑这是你在代码中使用的实际行。 –

+0

哦,对!感谢您注意它,这只是一个滑。 – Darktega

回答

5

一个不好的做法,普遍标签的东西“坏习惯”为替代讨论真正的问题和权衡。

某些技术可能不好,经常被滥用。 using和特别是using namespace指令可能会被滥用,所以一个奇怪的心态是只是说他们是某种“坏”的。

里面一个.cpp文件,你必须在命名空间(一个或多个)更多的控制,所以using std::cout在文件范围内,甚至using namespace my_funny_namespace是罚款,只要对冲突的机会是可控的且有可读性一定的增益。在某些时候,如果.cpp文件变得复杂,您可能会冒一个新名字被添加到some_funny_namespace的风险,该名称与您的某个名称冲突,并且using namespace some_funny_namespace会带来会破坏您的代码的内容。但是对于像boost或std这样稳定的东西,这可能不太可能。

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

它可以跨越线路成为一个非常糟糕的事情是当你在标题中使用其中任何一个。然后,你已经从另一个命名空间的名字泄漏到每个包含你的标题的文件中。 See this great answer替代和讨论。这是非常糟糕的,因为它可以导致包括或不包括在内的一个远程bug问题 - 包括一个头部导致一些完全不相关的问题出现或消失。这不仅仅是“你的”代码可能会破坏,它可能会破坏别人使用你的头文件的代码。

不漏的名字到其他命名空间

所以using,尤其是在using namespace是头verbotten?如果标题是在一组选定的.cpp文件内部使用的,该怎么办?那么,也许没关系。这就是cookie-cutter规则的问题,总是有一个例外,并且假设一些假设的东西更糟糕没有理由,但最佳做法是可怕的。

using的可读性(应该是而不是被低估)。

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

明智地选择。仔细考虑你的设计的各个方面是好习惯。

(并且问好的问题也不错)。

+0

感谢您的回答和关于提问的建议。我经常忘记编程不是绝对的,所以我只是继续前进,问道这是用于良好编程的强制性使用。对我来说,这只是一个早期程序员的过早行为。 我可能会使用命名空间,所以我可以从学校练习中提高自己的代码的可读性,但绝对不是在大型项目或类似项目中,所以我没有从头文件中获取任何泄漏。感谢您的回答,现在我掌握了要做的事情。 :) – Darktega

+0

不客气。 FWIW,我并不是在暗示你有“千篇一律”的心态,具有讽刺意味的是,我更担心你给出的建议。但是,经验法则也很好,如果它是很长答案的简写。很好的讨论。 – Anders

1

usingnamespace::identifier;是语言的一部分,因为在一些程序是有帮助的。您正在平衡简洁性和灵活性以抵御脆弱性,但最糟糕的情况是您必须通过明确您所指的对象来解决编译器错误。如果您只是使用大型名称空间中的少数标识符,而针对using语句通常是合理的折中;如果列表开始变得过大,则using namespace std;可能变得更容易。

既不应该在库的头文件中的文件范围内使用它们,因为它们将继续影响翻译单元的其余部分并制作中断客户端程序。

在限制范围,并在实现文件(.cpp.cc或任何扩展使用),可以基本承受实验using和修复含糊必要的 - 你会学到什么最适合你。

using std::begin;using std::end;特别有用using陈述很好的例子,因为它们允许begin(my_container)匹配std::begin()当后者有my_container过载,但如果my_containerbegin实际上是在任何命名空间中的容器的声明中,begin()能由于Argument Dependent Lookup仍然匹配。

提示:这是通常更好写[std::]cout << "Using namespaces like a boss!\n"; - 更简洁,为什么强迫冲水?它往往降低性能,并cout绑定到cin所以冲洗需要提示用户输入时会发生....

相关问题