Cの型宣言は読みにくい。
「例解UNIXプログラミング教室」(冨永和人、権藤 克彦 ピアソンエデュケーション)の説明が分かりやすい。
- 最左の識別子(関数名や変数名など)に注目する。それ以外の識別子は引数の名前なので無視する。
- 下記の優先度に従い、その識別子から外側に向かいカッコをつける。左側の*よりも先に、右側の()や[]にカッコをつけるのがポイント。
- 日本語なら外側から、英語なら内側から読む。
優先度(上ほど強く結合)
記号 説明 () 宣言のグループ化 [], () 配列、関数引数 * ポインタ その他 intなど 例: signalの型
void (*signal (int sig, void (*handler)(int)))(int);
- 最左の識別子はsignal。(sigとhandlerは引数)。
- signalからカッコをつける。
- *より()の方が強いので、signal (int sig, void (*handler)(int)) をカッコで囲む。
- 一番左のvoidより一番右の (int) の方が強いので、一番左の void 以外をカッコで囲む。
- 結果はこうなる。
void ((*(signal (int sig, void (*handler)(int))))(int));- 外側からカッコを外しながら読む。
- void ⚫; ⚫はvoid
- void (⚫)(int); ⚫はvoidを返す関数(引数はint)
- void (* ⚫)(int); ⚫はvoidを返す関数(引数はint)へのポインタ
- void (*signal(⚫))(int); signalはvoidを返す関数(引数はint)へのポインタを返す関数(引数は⚫)
- void (*signal(int sig, void (*handler)(int)))(int); signalはvoidを返す関数(引数はint)へのポインタを返す関数(引数はintとvoidを返す関数(引数はint))