【发布时间】:2018-07-14 03:16:01
【问题描述】:
在 C++ 中包含 C 标准库头 <foo.h> 的推荐方法是包含相应的 C++ 头 <cfoo>。
根据我的经验,这会将 一些 相应的 C 构造放入 std 命名空间中,但其他一些在全局范围内,有时它们会出现在两个地方(即 @987654325 @命名空间和全局范围)。
这取决于编译器(有些人喜欢只在 std 中包含 size_t 而不是在全局范围内,其他人总是在全局范围内包含它)和构造(例如既不是 assert 也不是 @尽管包括 cassert 和 cerrno,但 987654329@ 似乎曾出现在 std 命名空间中。
标准的要求是什么,是否有任何简单的规则可移植地访问与std 命名空间内外的位置相关的 C 构造(比 using namespace std 更好)?
This question 涵盖相同的领域,但那里的答案已经反映了我的理解,即 cfoo 将所有内容都放在 std 中 - 但没有回答为什么像 assert 和 errno 这样的东西不要这样的问题t 出现在std 在那种情况下,以及如何知道类似“例外”的完整列表。
【问题讨论】:
-
@GManNickG - 这个问题有点窄(它询问东西是否也出现在全局命名空间中 - 但我的问题是“我怎样才能便携地使用任何 C 构造”)。这个问题的答案似乎是“不”——但这留下了如何使用任何给定结构的问题。例如,“否”并不意味着所有内容都出现在
std中,因为assert肯定不会出现(可能还有其他任何作为宏实现的内容)。另外,那里的答案很烂?被接受的似乎没有回答问题(也许引用被截断了)。 -
如有疑问,请始终添加
std:: -
@L.Kue - 它不起作用,考虑
assert。 -
@BeeOnRope
assert是一个宏,而不是一个函数,因此没有使用std::。 -
@BeeOnRope,另一个问答的要点是,包括
<c___>将保证std::中的名称。至于宏,你必须知道什么是宏,什么不是。其中许多都是大写的。
标签: c++ c c++11 c++-standard-library c-standard-library