我正在编写需要使用指向 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
,因此宏不会扩展,并且sigsetjmp
libc 中没有定义普通符号。我希望能够使用一些宏“黑魔法”来提取“__sigsetjmp”名称,但到目前为止我失败了。
另一种选择是 __sigsetjmp
直接使用,但这意味着检查每个受支持平台的扩展,我不想这样做(因此这个问题的原因)。
PS:我讨厌宏。
笔记:
我需要这个的原因有点模糊,但为了简化它,假设我想用它执行指针比较。
#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
void * sigsetjmp_p = sigsetjmp;
return p == sigsetjmp_p;
}
编辑:
是的是的。我知道我不应该指望得到一个指针,sigsetjmp
因为它在某些平台上甚至可能不是一个函数,但这并不能解决我的问题。
在实践中,我所知道的所有平台都将它作为一个函数来实现。
我可以应付这样一个事实,即在几年内,我遇到了一个sigsetjump
不适用于某些平台的功能的案例。但是我不想处理的是遍历每个受支持的平台并检查setjmp.h
宏定义,这是我现在唯一的选择。
我很欣赏对标准的引用,但我想得到一个实用的答案,而不是纯粹的答案。