在C++头文件中的"using namespace"

23 浏览
0 Comments

在C++头文件中的"using namespace"

这个问题已经有了答案:

为什么认为 \"using namespace std;\" 是不好的实践方法?

在我们所有的C++课程中,所有的老师总是会在他们的 .h 文件的 #include 后紧接着放置 using namespace std;。 对我来说,这似乎是很危险的,因为当我把那个头文件包含在另一个程序中时,我将在我的程序中导入这个命名空间,而我可能并没有意识到、打算或想要这样做(头文件的包含可以非常深嵌套)。

因此,我的问题是双重的:我是否正确认为 using namespace 不应该在头文件中使用,或者是否有一些方法可以撤销它,例如:

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

还有一个类似的问题:头文件是否应该包含其对应的 .cpp 文件所需要的所有头文件,只包含头文件定义所需的头文件并让 .cpp 文件包含剩余的头文件,或者不包含任何头文件并将其需要的所有内容声明为 extern? 问题背后的原因与上面的相同:我不想在包含 .h 文件时出现意料之外的情况。

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

谢谢。

admin 更改状态以发布 2023年5月20日
0
0 Comments

在Sutter和Alexandrescu的《C++编码规范:101条规则,指导和最佳实践》中的第59项规则:

59. 在头文件或#include之前不要写命名空间using。

命名空间using是为了方便您自己,而不是为了强加于他人:在#include之前不要写using声明或using指令。

推论:在头文件中,不要编写命名空间级别的using指令或using声明;而是明确地命名空间限定所有名称。

头文件是一个或多个源文件中的客人。一个包含using指令和声明的头文件也带来了它的顽皮伙伴们。

using声明引入一个伙伴。using指令将所有命名空间中的伙伴都引入。您老师对using namespace std;的使用是一个using指令。

更重要的是,我们有命名空间来避免名称冲突。头文件旨在提供一个接口。大多数头文件不知道当前或未来可能包含它们的任何代码。在头文件中添加using语句以方便内部使用,将这些方便的名称强加于该头文件的所有潜在客户端。这可能会导致名称冲突。而这样做是很粗鲁的。

0
0 Comments

你绝对不应该在头文件中使用using namespace,就像你所说的那样,它可能会意外地改变包含该头文件的任何其他文件中代码的含义。另一个原因是它是如此危险的,因为没有办法撤消using namespace。通常,我只是使用像grep这样的工具来确保头文件中没有调用using namespace,而不是尝试任何更复杂的操作。可能静态代码检查器也会警告此问题。

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

我不确定我会称其为常见现象,但它确实偶尔会出现,通常是由新程序员编写的,他们不知道负面后果。通常,通过对风险的一点教育即可解决任何问题,因为相当容易修复。

0