哪些 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 也不是 @尽管包括 cassertcerrno,但 987654329@ 似乎曾出现在 std 命名空间中。

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

This question 涵盖相同的领域,但那里的答案已经反映了我的理解,即 cfoo 将所有内容都放在 std 中 - 但没有回答为什么像 asserterrno 这样的东西不要这样的问题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 是一个很好的资源,你可以看看 来了解一下。 en.cppreference.com/w/cpp/header/cmath

以上是关于哪些 C 构造出现在 std 命名空间中?的主要内容,如果未能解决你的问题,请参考以下文章

C++std命名空间和头文件详解

为啥我在vs2010下编写代码的时候代码下面会出现红色波浪线?

从cmath文件看名字是怎样被添加到命名空间std中的

使用在同一命名空间中定义的构造函数实例化命名空间中的对象。 C++

C++ 从 std::async 函数读取命名空间中的全局变量标志

双冒号是啥意思?