我正在编写需要使用指向setjmp/sigsetjmp的指针的多平台代码。通常那就像做一样简单

#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;

但是,ISO和POSIX指出可以将setjmp/sigsetjmp定义为宏,而在我的Linux机器中确实是如此。这是/usr/include/setjmp.h的摘录:
# define sigsetjmp(env, savemask)       __sigsetjmp (env, savemask)

问题是,由于我没有将参数传递给sigsetjmp,因此宏不会扩展,并且libc中未定义普通的sigsetjmp符号。我希望能够使用一些宏“black magic”来提取“__sigsetjmp”名称,但是到目前为止,我不幸地失败了。

另一个选择是直接使用__sigsetjmp,但这将意味着检查每个受支持平台的扩展,这是我不想做的(因此,出现此问题的原因)。

PS:我讨厌宏。

注意:

我需要它的原因有点晦涩难懂,但是为了简化起见,假设我要对其进行指针比较。
#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
 void * sigsetjmp_p =  sigsetjmp;
 return p == sigsetjmp_p;
}

编辑:

是的是的。我知道我不应该指望sigsetjmp的指针,因为在某些平台上它甚至可能不是函数,但是并不能解决我的问题

实际上,我所知道的所有平台都将其实现为功能。

我可以应付这样的事实:几年后,我遇到了sigsetjump对某些平台不起作用的情况。但是我不想处理的是遍历每个受支持的平台,并检查setjmp.h的宏定义,这是我目前唯一的选择。

我赞赏引用标准,但我想得到一个实用的答案,而不是纯粹的答案。

最佳答案

您不能随便执行此操作,因为该标准明确禁止这样做(第7.13节):



POSIX在其中添加了



除了此处无关的一些异常(exception)。

至于你的话



在GCC中,setjmp是内置的,我相信Clang也是如此,sigsetjmp也是如此。 (尽管C库也可能具有函数版本。)

10-06 05:53