Ich schreibe Multiplattformcode, der einen Zeiger auf setjmp/sigsetjmp verwenden muss. Normalerweise wäre das so einfach wieMakrohölle: Plattformunabhängiger Zeiger auf setjmp/sigsetjmp
tut#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;
jedoch ISO und POSIX Zustand, der/sigsetjmp setjmp kann als Makro definiert werden, und in der Tat, dass der Fall in meiner Linux-Box. Hier ist ein Auszug aus /usr/include/setjmp.h
:
# define sigsetjmp(env, savemask) __sigsetjmp (env, savemask)
Das Problem ist, dass, da ich keine Argumente zu sigsetjmp
vorbei, wird das Makro nicht erweitern und die Ebene sigsetjmp
Symbol nicht in libc definiert. Ich hatte gehofft, dass ich Makro-Schwarzmagie verwenden könnte, um den Namen "__sigsetjmp" zu extrahieren, aber bisher bin ich kläglich gescheitert.
Eine andere Option wäre die direkte Verwendung __sigsetjmp
, aber das würde bedeuten, die Erweiterung für jede unterstützte Plattform zu überprüfen, was ich nicht tun möchte (daher der Grund für diese Frage).
PS: Ich hasse Makros.
Hinweis:
Der Grund für die ich brauche das ein bisschen dunkel, aber es zu vereinfachen, sagen wir, ich Zeiger Vergleiche mit ihm ausführen möchten.
#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
void * sigsetjmp_p = sigsetjmp;
return p == sigsetjmp_p;
}
Edit:
Ja, ja. Ich weiß, dass ich nicht darauf zählen sollte, einen Zeiger auf sigsetjmp
zu bekommen, weil es vielleicht nicht einmal eine Funktion in bestimmten Plattformen ist, aber das löst mein Problem nicht.
In der Praxis implementieren alle Plattformen, die ich kenne, es als eine Funktion.
Ich kann mit der Tatsache fertig werden, dass ich in ein paar Jahren, in dem Fall, in dem sigsetjump
keine Funktion für bestimmte Plattform ist. Aber was ich nicht bewältigen möchte, ist, jede unterstützte Plattform zu durchlaufen und setjmp.h
auf Makrodefinitionen zu überprüfen, was momentan meine einzige Option ist.
Ich schätze die Verweise auf Standards, aber ich würde gerne eine praktische Antwort nicht purist einen bekommen.
Btw., Einen Funktionszeiger auf ein 'void *' zu werfen ist auch nicht tragbar. –
Es gibt einen wirklichen Grund dafür, aber es ist ziemlich lang zu erklären (es beinhaltet das Wrapping von Funktionen). Vertrauen Sie mir, ich brauche diesen Zeiger :) – fons
@larsmans wahr, ich wollte nur ein vereinfachtes Beispiel zur Verfügung stellen. Wenn man p einen richtigen Typ gibt, ändert sich das Problem nicht. – fons