setjmp/sigsetjmpへのポインターを使用する必要があるマルチプラットフォームコードを書いています。通常、それは行うのと同じくらい簡単です
#include <setjmp.h>
void * sigsetjmp_p = sigsetjmp;
ただし、ISOとPOSIXは、setjmp / sigsetjmpをマクロとして定義できると述べており、実際、私のLinuxボックスの場合はそうです。これがからの抜粋です/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;
}
編集:
はいはい。sigsetjmp
特定のプラットフォームでは関数ではない可能性があるため、ポインタを取得することを期待すべきではないことはわかっていますが、これでは問題は解決しません。
実際には、私が知っているすべてのプラットフォームは、それを関数として実装します。
sigsetjump
数年後には、特定のプラットフォームで機能しない場合が発生することに対処できます。しかし、私が対処したくないのは、サポートされているすべてのプラットフォームを調べsetjmp.h
て、マクロ定義をチェックすることです。これは、現在の私の唯一のオプションです。
標準への参照に感謝しますが、純粋なものではなく、実用的な答えを得たいと思います。