c++ - C++ 头文件中的 "using namespace"

标签 c++ namespaces header-files

在我们所有的 c++ 类(class)中,所有老师总是将 using namespace std; 放在他们的 .h 文件中的 #include 之后.在我看来,这似乎很危险,因为从那时起,通过将该 header 包含在另一个程序中,我会将命名空间导入到我的程序中,可能没有意识到、有意或想要它( header 包含可以非常深入地嵌套)。

所以我的问题是双重的:我是否正确 using namespace 不应该在头文件中使用,和/或有什么方法可以撤消它,例如:

//header.h
using namespace std {
.
.
.
}

同理还有一个问题:头文件 #include 是否应该包含它对应的 .cpp 文件所需的所有头文件,只有那些头文件需要的头文件定义并让 .cpp 文件 #include 其余部分,或者没有并将它需要的所有内容声明为 extern?
问题背后的原因与上面相同:包含 .h 文件时,我不希望出现意外。

另外,如果我是对的,这是一个常见的错误吗?我的意思是在现实世界的编程和那里的“真实”项目中。

谢谢。

最佳答案

您绝对不应该在标题中使用 using namespace 正是因为您所说的原因,它可能会意外地更改包含该标题的任何其他文件中代码的含义。没有办法撤消 using namespace 这是它如此危险的另一个原因。我通常只使用 grep 或类似的东西来确保 using namespace 不会在标题中被调用,而不是尝试任何更复杂的东西。可能静态代码检查器也会标记这一点。

头文件应该只包含它需要编译的头文件。执行此操作的一种简单方法是始终将每个源文件自己的 header 作为第一件事包含在任何其他 header 之前。如果 header 不是自包含的,则源文件将无法编译。在某些情况下,例如引用库中的实现细节类,您可以使用前向声明而不是 #include,因为您可以完全控制此类前向声明​​类的定义。

我不确定我是否会称其为常见,但它肯定会偶尔出现,通常由不了解负面后果的新程序员编写。通常只需对风险进行一点教育就可以解决任何问题,因为它相对容易解决。

关于c++ - C++ 头文件中的 "using namespace",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5849457/

相关文章:

c++ - 'avct' 是合法的 long 值还是合法的 var/const?

c# - 全局引用命名空间?

c++ - 库的 .h 文件中出现 "{return 0;}"或 "{;}"的原因

c++ - #include循环依赖错误

c++ - reinterpret_cast 和 c-style cast 是否兼容(按 C++ 标准)?

c++ - 为什么 bitand 没有正确解析以形成右值引用?

file - 大型 clojure 项目是如何组织的?

c++ - 实例化一个类模板并调用它的方法

c++ - 在 C++ 中访问 Lua 函数的返回值,反之亦然

c# - 使用嵌套命名空间