c++ - 正在使用命名空间标准;强制的
问题描述
为什么这段代码不需要 std 命名空间。
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
解决方案
因为您包含了 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 std
或std::
在使用命名空间std
时,
推荐阅读
- javascript - Leaflet 中有没有办法从 L.easybutton 重置功能?
- input - 如何在 GNU Prolog 中读取用户的一行输入,直到 EOF 被击中?
- google-oauth - C++Builder TWebBrowser 不适用于 Google OAuth 登录
- c# - 如何找到平面大小和位置并在其上生成随机对象?
- javascript - 如何立即更改 DOM 元素?
- php - 从使用联合的 sql 语句中添加总计
- database - 错误:“threat_detection_policy”:属性最多支持 1 个项目,配置已声明 2 个
- swift - 如何将一个闭包附加到另一个闭包?
- javascript - 扩展 RxJS 主题以包含操作符
- reactjs - SyntaxError:在 npm 启动期间,.less 文件中带有 @import 的无效或意外令牌