首页 > 解决方案 > 哪些 C 构造出现在 std 命名空间中?

问题描述

在 C++ 中包含 C 标准库头文件的推荐方法<foo.h>是包含相应的 C++ 头文件<cfoo>

根据我的经验,这会将一些相应的 C 构造放入std命名空间中,但其他一些在全局范围内,有时它们会出现在两个地方(即,在std命名空间和全局范围内)。

它取决于编译器(有些人喜欢size_t只包含std在全局范围内而不是在全局范围内,其他人总是在全局范围内包含它)和构造(例如,尽管包含and ,但既不assert也不error似乎出现在命名空间中)。stdcassertcerrno

标准的要求是什么,是否有任何简单的规则来可移植地访问与std命名空间内外的位置相关的 C 构造(比 更好using namespace std)?

这个问题cfoo涵盖了相同的领域,但那里的答案已经反映了我对所有内容的理解std- 但没有回答为什么在这种情况下喜欢asserterrno不出现的问题std,以及如何知道类似的完整列表“例外”。

标签: c++cc++11c++-standard-libraryc-standard-library

解决方案


Assert 和 errno 是预处理器宏,它们是宏意味着它们不能识别名称空间和范围。(预处理器在编译之前运行,不尊重任何范围/命名空间)

这些头文件中除宏之外的所有内容<cfoo>都应放置在 std 命名空间中。


推荐阅读