【问题标题】:ANSI C functions namespace in ISO C++ [duplicate]ISO C ++中的ANSI C函数命名空间[重复]
【发布时间】:2010-12-04 04:38:37
【问题描述】:

考虑以下小程序:

#include <cstdio>

int main() {
    printf("%d\n", 1);
    std::printf("%d\n", 2);
    return 0;
}
  1. 关于将 C 库函数导入全局命名空间默认,C++ 标准有何规定?你能指出相关的 C++ 标准部分吗?
  2. ANSI C 函数首先位于 std 命名空间中的原因是什么,因为它们默认导入到全局命名空间中?

【问题讨论】:

  • 请编辑您的代码:编译器无法识别像 1 和 2 这样的幻数
  • 正如 LaszloG 所评论的 .. 对不起

标签: c++ c standards


【解决方案1】:

7.4.1.2/4:

除了第 18 到 27 条中的说明外,每个标头 cname 的内容应与相应标头 name.h 的内容相同,如 ISO/IEC 9899:1990 编程语言 C(第 7 条)中规定的, 或 ISO/IEC:1990 Programming Languages—C AMENDMENT 1: C Integrity,(第 7 条),视情况而定,如同包含在内。但是,在 C++ 标准库中,声明和定义(在 C 中定义为宏的名称除外)在命名空间 std 的命名空间范围 (3.3.5) 内。

D.5/2:

每个 C 标头,每个都具有 name.h 形式的名称,其行为就像每个由相应 cname 标头放置在标准库命名空间中的名称也放置在命名空间 std 的命名空间范围内一样后跟一个显式的 using 声明 (7.3.3)。

然而,在实践中,name.h 将名称包含在全局命名空间中,cname 包含在全局命名空间和 std 命名空间中(即与标准指定的相反)。

【讨论】:

  • 这些段落的措辞已经被 C++0x 修改了,因为尤其是第二个是 (imo) 相当令人困惑的措辞 :) 它现在读作“每个 C 标头,每个标头都有一个名称形式 name.h, 表现得好像每个由相应 cname 头放置在标准库命名空间中的名称都放置在全局命名空间范围内。未指定这些名称是首先在命名空间范围 (3.3.6) 内声明还是定义命名空间std,然后通过显式使用声明(7.3.3)注入全局命名空间范围。”
  • 我认为它值得包含在实际答案中。
【解决方案2】:

关于您的第一个问题:TTBOMK,不合格的printf 在包含&lt;cstdio&gt; 时不应该在标准C++ 中工作。

第二个问题:首先,C++ 标准库使用了大量的标识符,其中包括listsortiterator 等有用且常见的标识符。如果它们都在全局命名空间中,我们实际上会被剥夺数百个有用的名称。

另外,如果您使用显式的 std:: 前缀几周,您可能会发现代码更容易阅读,因为它非常有效地告诉您哪些标识符来自标准库(因此您可以立即知道它们)。

【讨论】:

  • 对不起,我没有说清楚。我在问当标准 C89 函数被导入全局命名空间时,将它们放入命名空间 std 的原因是什么。我已经编辑了问题。
  • 正如我所说,TTBOMK,如果你包含&lt;header.h&gt;,它们只会在全局命名空间中,而不是当你包含&lt;cheader&gt;时。但即使这是错误的并且它们通过包含&lt;cheader&gt; 被注入到全局命名空间中,我的论点仍然成立:例如,如果另一个标识符list (通过一些using your_ns)被注入到全局命名空间中,您仍然可以通过它们的命名空间名称来引用它们:std::list/your_ns::list。这就是为什么它们在 std 命名空间中是一件好事。
【解决方案3】:

我个人喜欢命名空间,尤其是短的。

人们通常认为既然你有一个命名空间来键入它,它就会更长,但这是错误的。键入命名空间的好处之一是您的编辑器可以更有效地使用自动完成;)

除了打字(因为有人可能会争辩说你打字比自动完成更快),还有一个净优势,如果我输入'std::re',我将被提示所有以're开头的标识符' 在 std 命名空间中,省去了记住每一个的麻烦,然后我还可以直接查看它们的参数,以防我不记得确切的顺序、常量等...

从技术上讲,名称冲突也存在一些问题……但谁在乎;)?

【讨论】:

    【解决方案4】:

    &lt;stdio.h&gt; 是将&lt;cstdio&gt; 中的函数导入全局命名空间的标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2014-05-10
      • 2023-03-06
      • 2015-07-05
      • 1970-01-01
      • 2013-06-14
      • 2012-11-12
      相关资源
      最近更新 更多