Macのsignal.h
inにこの行が表示されました。/usr/include/sys/
関数の戻り値の型としての使用に基づいて、整数入力を取り、void を返す関数へのポインターであるsignal
と予想します。SIG_ERR
しかし、 のマクロ展開はSIG_ERR
、関数ポインター型から 1 を減算するように見えますが、これは奇妙に感じました。Cはそれをどのように解析しますか?
#define SIG_ERR ((void (*)(int))-1)
( (void(*)(int)) -1)
関数ポインターから 1 を減算するのではなく、定数値 -1 を関数ポインターにキャストします。
補足として、関数ポインターからの加算または減算は ISO C では許可されておらず、基本的に char ポインターであるかのように処理する (やや特殊な) gcc 拡張機能としてのみ実行できます。
GCC では、型 void のポインターおよび関数へのポインターで加算および減算操作が許可されます。通常、ISO C はそのようなポインターでの算術演算を許可しません。これは、「void」のサイズはばかげた概念であり、ポインターが実際に指しているものに依存するためです。このような計算を容易にするために、GCC は参照オブジェクトのサイズを 1 バイトとして扱います。