使用声明应该放在哪里?

5

关于 using 声明(例如 using std::vector;),推荐的实践是什么?

它应该放在 cpp/cc 文件的顶部,还是只放在使用它的作用域中?


9
除了用于 ADL 控制和取消隐藏基类名称外,using 应该不再使用。如果命名空间名称太长,可以使用命名空间别名。 - Kerrek SB
2
看这里,了解kerrek所说的内容的解释:https://dev59.com/D3M_5IYBdhLWcg3wQQ3w#1453605 - Stephan Dollberg
@MikMik:只是一个案例,出了问题:http://stackoverflow.com/a/9279462/1141095 - ezdazuzena
4个回答

2

总的来说,限制其范围会更好,但在实践中,为了使它产生影响,您的源文件需要添加相当数量的代码。


2
C++编码规范中的第59章,题为“不要在头文件或#include之前编写命名空间using”。因此,他们建议您不要在#include指令之前编写使用声明或使用指令,因为这可能会影响所包含的代码。这也意味着您不应该在自己的头文件中编写using,因为其他人可能会将其#include,并且这会改变包含点的行为(例如一些Boost头文件库)。
因此,在头文件和#include指令之前不要编写using。在#include指令后,可以在实现文件中自由编写using。

谢谢您的澄清,因为我一直在思考使用每个#include的代码片段的可行性。就像在Java中进行导入一样。 - daminetreg
关于 using 和头文件:即使是在你自己的命名空间中,也要避免使用 using 声明类型(而不是整个命名空间),以避免大量使用 std:: 前缀。 - thomthom
@thomthom,我不知道。他们只提到像使用命名空间blah;这样的语句,我猜使用blah::type也是可以的。但如果你找到任何确认信息,我很乐意听取你的意见。 - Anton Daneyko
1
我发现有一个话题简要提到了它,但它讨论了如果你using std::vector而“其他人”在你的命名空间中定义了一个vector类,则会发生名称冲突。然而,我并不明白这与我定义自定义Foo类并且“其他人”也尝试在我的命名空间内定义Foo类有什么区别。如果我对这个特定用法有更多的澄清细节,我会回来查看的。(虽然很难找到它表明少数人使用它-但我仍然想知道为什么)。 - thomthom

0

如果它在cpp文件中,那就是一个风格问题。有些人更喜欢完全避免使用using声明以避免任何歧义。如果在头文件中,始终将其放在某些作用域内,否则遵循变量的规则:尽可能将事物放在最小的作用域中。


0
为了可读性,最好将其放在开头。否则,请尽可能在最小的范围内使用。
为了使代码更清晰易懂,应避免使用using更新: 请考虑mezhaka的评论。我没有表达得够准确,但是指的是“真正”代码的开头,即在#includes之后。

1
如果你把它放在 #include 语句之前的开头位置,那么你会影响到 #included 文件,从而改变 #included 代码的含义。这可能不是你想要的结果。 - Anton Daneyko
@mezhaka:抱歉表述不够准确。你说得完全正确。我更多地是指“真正”代码的开头部分。 - ezdazuzena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接