首页 > 解决方案 > 正在使用命名空间标准;强制的

问题描述

为什么这段代码不需要 std 命名空间。

#include <stdio.h>

int main()
{
     printf("Hello World");
     return 0;
}

标签: c++

解决方案


因为您包含了 C 标头,而不是 C++ 标头。

[library.c/1]:C++ 标准库还提供了 C 标准库的功能,经过适当调整以确保静态类型安全。

[depr.c.headers.other/1]: <complex.h>除了, <iso646.h>, <stdalign.h>, <stdbool.h>, and之外的每个 C 头文件<tgmath.h>每个都有一个形式的名称<name.h>,表现得好像每个由相应<cname>头文件放置在标准库命名空间中的名称都放置在全局命名空间范围内,但在中描述的函数除外。[sf.cmath]std::byte( [cstddef.syn]) 的声明,以及 中描述的函数和函数模板[support.types.byteops][..] 未指定这些名称是否首先在命名空间[basic.scope.namespace]的命名空间范围 ()内声明或定义,然后通过显式使用声明std( )注入全局命名空间范围[namespace.udecl]

上面最后一个粗体部分表示您可能也可以使用std::printf,但不能保证这一点。

另请注意,标头已弃用:

[diff.mods.to.headers/1]:为了与 C 标准库兼容,C++ 标准库提供了在 中枚举的 C 头文件[depr.c.headers],但在 C++ 中不推荐使用它们。

在硬币的另一面,如果您cstdio改为包含,则可以保证获得std::printf,但不能保证(您使用的全局符号的完全限定名称)的可用性::printf

[headers/4]:除了在 和 中注明外[library][thread]每个[depr]文件cname的内容与 C 标准库中指定的相应头文件name.h的内容相同。然而,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)在 namespace 的命名空间范围内std未指定这些名称(包括[language.support]通过[thread]and添加的任何重载[depr])是否首先在全局命名空间范围内声明,然后通过显式使用声明()注入命名空间。std[namespace.udecl]


精简版:

  • 像 C 头文件stdio.h在全局命名空间中,也可能在std;
  • C++ 头文件cstdio位于命名空间std中,也可能位于全局命名空间中。

您只需要using namespace stdstd::在使用命名空间std时,


推荐阅读