【问题标题】:C++: What's happen when I use "using namespace xyz" before #include<headerxy> [duplicate]C ++:当我在#include <headerxy>之前使用“使用命名空间xyz”时会发生什么[重复]
【发布时间】:2011-10-17 05:23:30
【问题描述】:

可能重复:
Ordering of using namespace std; and includes?

听说强烈禁止在“#include”之前使用“using namespace xy”。例如

#include <iostream>

using namespace std;

int main() {
...
}

这样做的技术原因是什么?我尝试了以下,它没有任何问题:

using namespace std;

#include <iostream>

int main() {
....
}

【问题讨论】:

  • 你从哪里听到的?他们提供了某种理由吗?我想不出来。
  • 不同意,因为std:: 是一个特例,这个问题更广泛。

标签: c++ namespaces include


【解决方案1】:

技术原因是using 只会将当前可见的任何内容导入当前命名空间。

如果你在using 之后include 处理一个文件,你就会引入一个“奇怪”的顺序依赖。当然,这可能是你想要的,所以它不是被语言禁止的。但是,您在使用后有效地更改了包含的标题的含义,因为您将标题暴露给不同的上下文(并且名称查找可能会找到其他名称,具体取决于上下文)。名称查找规则有时可能很微妙,您不想在其他人的代码中引入微妙之处。

在“C++ 编码标准”(Sutter,Alexandrescu)一书的第 59 章:“不要在头文件中或 #include 之前编写命名空间使用”中对此进行了很好的讨论

【讨论】:

  • 这适用于 using 声明,但不适用于 using 指令,这是这里讨论的内容。 “对于每个指定成员命名空间的 using 指令 ​​(7.3.4),成员的潜在范围包括在成员声明点之后的 using 指令的潜在范围部分。”名称不必在 using 指令之前的范围内。
【解决方案2】:

我能想到一个很好的理由。如果命名空间没有 已经声明,声明是非法的。至少通过我的阅读 标准的;大多数编译器似乎都处理 using 指令 (using namespace <i>name</i>;) 好像是一个声明 命名空间的,尽管标准中没有我能做到的 找到证明这一点的理由。

更一般地说,最好尽量避免命名空间指令 可能,除非在非常有限的范围内(而且我永远不会使用命名空间 std 的指令,因为它的内容太多了 绘制)。

【讨论】:

    【解决方案3】:

    不,不是强烈禁止(否则会出现编译或预处理错误)。

    using 关键字将所有函数和变量放入当前命名空间,不鼓励在头文件中使用。

    【讨论】:

    • +1 表示it is discouraged to use it in the header files;因为在.cpp 文件中可以使用(并不总是不好的做法)。
    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2017-09-13
    • 2011-04-25
    • 2023-03-29
    • 2023-04-01
    相关资源
    最近更新 更多