c++ - 哪些 C 构造出现在 std 命名空间中?
问题描述
在 C++ 中包含 C 标准库头文件的推荐方法<foo.h>
是包含相应的 C++ 头文件<cfoo>
。
根据我的经验,这会将一些相应的 C 构造放入std
命名空间中,但其他一些在全局范围内,有时它们会出现在两个地方(即,在std
命名空间和全局范围内)。
它取决于编译器(有些人喜欢size_t
只包含std
在全局范围内而不是在全局范围内,其他人总是在全局范围内包含它)和构造(例如,尽管包含and ,但既不assert
也不error
似乎出现在命名空间中)。std
cassert
cerrno
标准的要求是什么,是否有任何简单的规则来可移植地访问与std
命名空间内外的位置相关的 C 构造(比 更好using namespace std
)?
这个问题cfoo
涵盖了相同的领域,但那里的答案已经反映了我对所有内容的理解std
- 但没有回答为什么在这种情况下喜欢assert
和errno
不出现的问题std
,以及如何知道类似的完整列表“例外”。
解决方案
Assert 和 errno 是预处理器宏,它们是宏意味着它们不能识别名称空间和范围。(预处理器在编译之前运行,不尊重任何范围/命名空间)
这些头文件中除宏之外的所有内容<cfoo>
都应放置在 std 命名空间中。
推荐阅读
- django - 使用带有附加输入的表单时,Django post-form 无法验证
- javascript - 隐藏 Modal 而不是卸载它有什么好处?
- django - 我应该使用什么电子邮件 API 来支持用户可以注册然后发送电子邮件的应用程序?
- vue.js - Vue 3:使用组合 API 正确实现动态布局渲染
- java - 在保持数据完整性的同时对循环依赖进行建模
- python - 如何在 Python 中检查输入是字符串还是浮点数?
- reactjs - 使用 JEST 和酶对异步函数进行 React JS 单元测试
- vaadin - 如何使用 Vaadin Flow Grid 示例左键单击以处理列可见性示例
- jsp - 在 Jmeter/Loadrunner 中处理浏览器动态值
- encryption - 关于 DES-CBC 模式下加密的 RTP/RTCP 问题