Sto scrivendo un codice multipiattaforma che deve utilizzare un puntatore per impostare jmp/sigsetjmp. Normalmente questo sarebbe semplice come fareMacro inferno: puntatore indipendente dalla piattaforma per setjmp/sigsetjmp
#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;
Tuttavia, ISO e POSIX stato che setjmp/sigsetjmp può essere definito come una macro, e in effetti questo è il caso nella mia casella di Linux. Ecco un estratto dal /usr/include/setjmp.h
:
# define sigsetjmp(env, savemask) __sigsetjmp (env, savemask)
Il problema è che, dal momento che non sto passando argomenti per sigsetjmp
, la macro non espandere e il sigsetjmp
simbolo pianura non è definito nella libc. Speravo di poter usare qualche macro "magia nera" per estrarre il nome "__sigsetjmp", ma finora ho fallito miseramente.
Un'altra opzione potrebbe utilizzare __sigsetjmp
direttamente ma ciò implicherebbe il controllo dell'espansione per ogni piattaforma supportata, che non voglio fare (da qui il motivo di questa domanda).
PS: Odio i macro.
Nota:
La ragione per cui ho bisogno di questo è un po 'oscuro, ma per semplificare, diciamo che voglio eseguire confronti puntatore con esso.
#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
void * sigsetjmp_p = sigsetjmp;
return p == sigsetjmp_p;
}
Edit:
Sì, sì. So che non dovrei contare sul fatto di ottenere un puntatore su sigsetjmp
perché potrebbe non essere nemmeno una funzione in alcune piattaforme, ma lo non risolve il mio problema.
In pratica, tutte le piattaforme che conosco implementano come funzione.
Sono in grado di far fronte al fatto che, in pochi anni, mi imbatto in un caso in cui non è una funzione per determinate piattaforme. Ma quello che non mi piacerebbe affrontare è passare attraverso ogni piattaforma supportata e controllare setjmp.h
per le definizioni di macro, che è la mia unica opzione al momento.
Apprezzo i riferimenti agli standard ma mi piacerebbe avere una risposta pratica non uno purista uno.
Btw., La trasmissione di un puntatore a un 'void *' è anch'essa non portabile. –
C'è una vera ragione per questo, ma è piuttosto lungo da spiegare (riguarda il wrapping delle funzioni). Fidati di me, ho bisogno di quel puntatore :) – fons
@larsmans true, volevo solo fornire un esempio semplificato. Dare un tipo corretto a p non cambia il problema. – fons