【问题标题】:Why isn't setjmp in the std namespace when including <csetjmp>?为什么包含 <csetjmp> 时 std 命名空间中没有 setjmp?
【发布时间】:2011-10-28 23:32:25
【问题描述】:

标题说明了一切。在包含 &lt;csetjmp&gt; 之后,longjmpjmp_buf 位于 std 命名空间中,但 setjmp 不在。我在 MinGW4.5 和 MSVC10 上验证了这一点。在查看 &lt;csetjmp&gt; 标头后,我无法弄清楚这个选择的原因。我一直假设每个&lt;cheader&gt; 文件都将&lt;header.h&gt; 包装在std 命名空间中。

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

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

【问题讨论】:

  • sigsetjmp() 是否可以作为首选替代品?
  • 不,在包含 之后,我在 std 命名空间内外都没有可用的 sigsetjmp。
  • 希望禁用它。但是不,宏没有命名空间范围。

标签: c++ std setjmp


【解决方案1】:

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

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

换句话说,它是一个宏。

【讨论】:

  • 谢谢!但是是否可以定义这样的别名:# define std::setjmp setjmp
  • @overcoder:这是不可能的,因为宏名只能是一个标识符。
猜你喜欢
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2018-07-08
  • 2020-10-03
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多