Ich schreibe Multiplattform-Code, der einen Zeiger auf setjmp / sigsetjmp verwenden muss. Normalerweise wäre das so einfach wie
%Vor% Allerdings geben ISO und POSIX an, dass setjmp / sigsetjmp als Makro definiert werden kann, und das ist tatsächlich in meiner Linux-Box der Fall. Hier ein Auszug aus /usr/include/setjmp.h
:
Das Problem ist, dass, da ich keine Argumente an sigsetjmp
übergebe, das Makro nicht expandiert und das einfache sigsetjmp
-Symbol nicht in libc definiert ist. Ich hatte gehofft, etwas Makro-Schwarzmagie verwenden zu können, um den Namen "__sigsetjmp" zu extrahieren, aber ich bin bis jetzt kläglich gescheitert.
Eine andere Option wäre die Verwendung von __sigsetjmp
direkt, 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, warum ich das brauche, ist etwas unklar, aber um es zu vereinfachen, sagen wir mal, dass ich Zeigervergleiche damit machen möchte.
%Vor%Bearbeiten:
Ja, ja. Ich weiß, ich sollte nicht darauf zählen, 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, dies als eine Funktion.
Ich kann damit umgehen, dass ich in ein paar Jahren auf einen Fall gestoßen bin, in dem sigsetjump
für bestimmte Plattformen keine Funktion ist. Aber ich möchte nicht mit jeder unterstützten Plattform fertig werden und setjmp.h
für Makrodefinitionen überprüfen, was momentan meine einzige Option ist.
Ich schätze die Verweise auf Standards, aber ich möchte eine praktische Antwort bekommen, nicht eine puristische .
Sie können dies nicht portabel machen, da der Standard es explizit verbietet (§7.13):
Es ist nicht angegeben, ob
setjmp
ein Makro oder ein mit external deklarierter Bezeichner ist Verknüpfung. Wenn eine Makrodefinition unterdrückt wird, um auf eine tatsächliche Funktion zuzugreifen (...) ist das Verhalten nicht definiert.
Zu welchem POSIX fügt das hinzu
Die Funktion
seinsigsetjmp()
muss äquivalent zur Funktionsetjmp()
mit einigen Ausnahmen, die hier irrelevant sind.
Wie für Ihre Bemerkung
alle Plattformen, die ich kenne, implementieren es als Funktion
In GCC ist setjmp
ein eingebautes und ich glaube an Clang, also ist sigsetjmp
. (Obwohl die C-Bibliothek möglicherweise auch eine Funktionsversion hat.)
Für das, was Sie sagen, dass Sie wollen, würde ich etwas tun wie:
%Vor% Das wird dir eine sigsetjmp
-Funktion geben, von der du die Adresse nehmen kannst, aber du kannst sie nicht tatsächlich aufrufen ...