0

Macのsignal.hinにこの行が表示されました。/usr/include/sys/関数の戻り値の型としての使用に基づいて、整数入力を取り、void を返す関数へのポインターであるsignalと予想します。SIG_ERRしかし、 のマクロ展開はSIG_ERR、関数ポインター型から 1 を減算するように見えますが、これは奇妙に感じました。Cはそれをどのように解析しますか?

#define SIG_ERR         ((void (*)(int))-1)  
4

2 に答える 2

7
( (void(*)(int)) -1)  

関数ポインターから 1 を減算するのではなく、定数値 -1 を関数ポインターにキャストします。

補足として、関数ポインターからの加算または減算は ISO C では許可されておらず、基本的に char ポインターであるかのように処理する (やや特殊な) gcc 拡張機能としてのみ実行できます。

GCC では、型 void のポインターおよび関数へのポインターで加算および減算操作が許可されます。通常、ISO C はそのようなポインターでの算術演算を許可しません。これは、「void」のサイズはばかげた概念であり、ポインターが実際に指しているものに依存するためです。このような計算を容易にするために、GCC は参照オブジェクトのサイズを 1 バイトとして扱います。

于 2013-07-11T04:35:14.273 に答える