Macro hell: Plattformunabhängiger Zeiger auf setjmp / sigsetjmp

8

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 :

%Vor%

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 .

    
fons 06.03.2013, 15:03
quelle

3 Antworten

2

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 sigsetjmp() muss äquivalent zur Funktion setjmp()

sein

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.)

    
Fred Foo 06.03.2013, 15:07
quelle
0

Wie wäre es mit:

%Vor%

Verwenden Sie dann die Adresse von & amp; my_sigsetjmp

    
Neil 26.06.2014 16:59
quelle
-1

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 ...

    
Chris Dodd 06.03.2013 17:05
quelle

Tags und Links