为什么在包含时 setjmp 不在 std 命名空间中?

发布于 2024-12-13 01:34:00 字数 455 浏览 2 评论 0原文

标题说明了一切。包含 后,longjmpjmp_buf 位于 std 命名空间中,但 setjmp< /代码>不是。我在MinGW4.5和MSVC10上验证了这一点。在查看 标头后,我无法弄清楚此选择的原因。我一直假设每个 文件都在 std 命名空间中包装

我错了吗? setjmp 特殊情况背后的基本原理是什么?请赐教!

注意:我知道在 C++ 中滥用 setjmp/longjmp 的问题。

The title say it all. After including <csetjmp>, longjmp and jmp_buf are in the std namespace, but setjmpis not. I verified this on MinGW4.5 and MSVC10. After looking into the <csetjmp> header, I could not figure out the reason of this choice. I was always assuming that every <cheader> file is wrapping a <header.h> in the std namespace.

Am I wrong ? What's the rationale behind the setjmp special case ? Please enlighten me !

Note : I'm aware of the issues of misusing setjmp/longjmp in C++.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清欢 2024-12-20 01:34:00

setjmp 可以实现为宏,因此 C++ 标准在 17.6.1.2 [headers] 中有这样的规定:

在 C 中定义为宏的名称应在 C 中定义为宏
C++ 标准库,即使 C 授予实施许可证
作为函数。 [ 注意:C 中定义为宏的名称包括
以下:assertoffsetofsetjmpva_argva_end
va_start。 ——尾注]

换句话说,它是一个宏。

setjmp can be implemented as a macro, so the C++ standard has this to say in 17.6.1.2 [headers]:

Names which are defined as macros in C shall be defined as macros in
the C++ standard library, even if C grants license for implementation
as functions. [ Note: The names defined as macros in C include the
following: assert, offsetof, setjmp, va_arg, va_end, and
va_start. —end note ]

In other words, it's a macro.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文