I am writing multiplatform code which needs to use a pointer to setjmp/sigsetjmp. Normally that would be as simple as doing
#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;
However, ISO and POSIX state that setjmp/sigsetjmp can be defined as a macro, and indeed that is the case in my linux box. Here's an excerpt from /usr/include/setjmp.h
:
# define sigsetjmp(env, savemask) __sigsetjmp (env, savemask)
The problem is that, since I am not passing arguments to sigsetjmp
, the macro doesn't expand and the plain sigsetjmp
symbol is not defined in libc. I was hoping to be able to use some macro "black magic" to extract the "__sigsetjmp" name, but I have failed miserably so far.
Another option would be using __sigsetjmp
directly but this would imply checking the expansion for every supported platform, which I don't want to do (hence the reason of this question).
PS: I hate macros.
Note:
The reason for which I need this is a bit obscure, but to simplify it, let's say I want to perform pointer comparisons with it.
#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
void * sigsetjmp_p = sigsetjmp;
return p == sigsetjmp_p;
}
Edit:
Yes, yes. I know I shouldn't count on getting a pointer to sigsetjmp
because it might not even be a function in certain platforms but this doesn't solve my problem.
In practice, all platforms I know of implement it as a function.
I can cope with the fact that, in a few years, I run into a case in which sigsetjump
is not a function for certain platform. But what I wouldn't like to cope with is going through every supported platform and check setjmp.h
for macro definitions, which is my only option right now.
I appreciate the references to standards but I would like to get a practical answer not a purist one.