Я пишу мультиплатформенный код, которому нужно использовать указатель на setjmp/sigsetjmp. Обычно это было бы так просто, как делатьMacro hell: независимый от платформы указатель на setjmp/sigsetjmp
#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;
Однако, ISO и POSIX состояние, setjmp/sigsetjmp может быть определена как макрос, и в самом деле, что это происходит в моей коробке Линукс. Вот отрывок из /usr/include/setjmp.h
:
# define sigsetjmp(env, savemask) __sigsetjmp (env, savemask)
Проблема заключается в том, что, так как я не передавая аргументы sigsetjmp
, макрос не расширяется и равнину sigsetjmp
символ не определен в LIBC. Я надеялся, что смогу использовать макрос «черной магии» для извлечения имени «__sigsetjmp», но до сих пор я потерпел неудачу.
Другим вариантом будет использование __sigsetjmp
, но это подразумевает проверку расширения для каждой поддерживаемой платформы, что я не хочу делать (отсюда и причина этого вопроса).
PS: Я ненавижу макросы.
Примечание:
Причина, по которой мне нужно это немного неясный, но упростить ее, скажем, я хочу, чтобы выполнить указатель сравнения с ним.
#include <setjmp.h>
int equals_sigsetjmp(void *p)
{
void * sigsetjmp_p = sigsetjmp;
return p == sigsetjmp_p;
}
Edit:
Да, да. Я знаю, что я не должен рассчитывать на получение указателя на sigsetjmp
, потому что он может даже не быть функцией на определенных платформах, но это не решит мою проблему.
На практике все платформы, которые я знаю, реализуют его как функцию.
Я могу справиться с тем, что через несколько лет я столкнулся с ситуацией, в которой sigsetjump
не является функцией для определенной платформы. Но то, с чем я не хотел бы справляться, проходит через каждую поддерживаемую платформу и проверяет setjmp.h
для макроопределений, что является моим единственным вариантом прямо сейчас.
Я ценю ссылки на стандарты, но я хотел бы получить практический ответ, а не пурист один.
Btw., Литье указателя функции на 'void *' также не переносится. –
Существует настоящая причина для этого, но довольно долго объяснять (это связано с обертыванием функций). Поверьте мне, мне нужен этот указатель :) – fons
@larsmans true, я просто хотел предоставить упрощенный пример. Предоставление правильного типа p, хотя и не меняет проблему. – fons