哪些 C 构造出现在 std 命名空间中?
Posted
技术标签:
【中文标题】哪些 C 构造出现在 std 命名空间中?【英文标题】:Which C constructs appear in the std namespace? 【发布时间】: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::
中的名称。至于宏,你必须知道什么是宏,什么不是。其中许多都是大写的。
【参考方案1】:
Assert 和 errno 是预处理器宏,它们是宏意味着它们不能识别名称空间和范围。 (预处理器在编译之前运行,不尊重任何作用域/命名空间)
<cfoo>
标头中除宏之外的所有内容都应放在 std 命名空间中。
【讨论】:
所以这两个宏是唯一的例外——没有出现在::std
中的东西?
不,所有的宏都不会出现在::std
中——宏通常没有命名空间的概念。您实际上不能将宏放在名称空间中。我将相应地编辑我的答案。感谢您指出这一点。
我了解宏没有命名空间的概念,由预处理器实现。那不是问题。问题是 std
命名空间中没有出现哪些 C 构造?如果答案是“所有这些都实现为宏”,那么问题是这是否由标准定义以及我可以在哪里查看什么是宏。
Cppreference 是一个很好的资源,你可以看看 以上是关于哪些 C 构造出现在 std 命名空间中?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在vs2010下编写代码的时候代码下面会出现红色波浪线?
使用在同一命名空间中定义的构造函数实例化命名空间中的对象。 C++