我正在编写需要使用指向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库也可能具有函数版本。)