宏地狱:与setjmp/sigsetjmp无关的平台指针

fon*_*ons 8 c macros iso posix setjmp

我正在编写多平台代码,需要使用指向setjmp/sigsetjmp的指针.通常情况就是如此简单

#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;
Run Code Online (Sandbox Code Playgroud)

但是,ISO和POSIX声明setjmp/sigsetjmp可以定义为宏,事实上我的linux框就是这种情况.以下摘录自/usr/include/setjmp.h:

# define sigsetjmp(env, savemask)       __sigsetjmp (env, savemask)
Run Code Online (Sandbox Code Playgroud)

问题是,由于我没有传递参数sigsetjmp,宏不会扩展,并且sigsetjmp在libc中没有定义普通符号.我希望能够使用一些宏"黑魔法"来提取"__sigsetjmp"名称,但到目前为止我已经失败了.

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

PS:我讨厌宏.

注意:

我需要它的原因有点模糊,但为了简化它,我想说我想用它进行指针比较.

#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
 void * sigsetjmp_p =  sigsetjmp;
 return p == sigsetjmp_p;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

在实践中,我所知道的所有平台都将其作为一个功能实现.

我可以应对这样一个事实:在几年内,我遇到了一个sigsetjump不适合某个平台的案例.但我不想应对的是通过每个支持的平台并检查setjmp.h宏定义,这是我现在唯一的选择.

我很欣赏标准的参考,但我希望得到一个实际的答案而不是纯粹的答案.

Fre*_*Foo 2

您无法移植地执行此操作,因为标准明确禁止它(\xc2\xa77.13):

\n\n
\n

未指定setjmp是宏还是使用外部链接声明的标识符。如果为了访问实际函数(...)而抑制宏定义,则行为未定义。

\n
\n\n

POSIX 添加了以下内容

\n\n
\n

sigsetjmp()函数应等同于该setjmp()函数

\n
\n\n

但有一些与此处无关的例外情况。

\n\n

至于你的言论

\n\n
\n

我知道的所有平台都将其作为函数实现

\n
\n\n

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

\n