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.
You can't do this portably, as the standard explicitly forbids it (§7.13):
It is unspecified whether
setjmp
is a macro or an identifier declared with external linkage. If a macro definition is suppressed in order to access an actual function (...) the behavior is undefined.
To which POSIX adds that
The
sigsetjmp()
function shall be equivalent to thesetjmp()
function
with some exceptions that are irrelevant here.
As for your remark
all platforms I know of implement it as a function
In GCC, setjmp
is a built-in, and I believe in Clang, so is sigsetjmp
. (Though the C library might have a function version as well.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With