Cの宣言の読み方

Cの型宣言は読みにくい。
「例解UNIXプログラミング教室」(冨永和人、権藤 克彦 ピアソンエデュケーション)の説明が分かりやすい。

  1. 最左の識別子(関数名や変数名など)に注目する。それ以外の識別子は引数の名前なので無視する。
  2. 下記の優先度に従い、その識別子から外側に向かいカッコをつける。左側の*よりも先に、右側の()や[]にカッコをつけるのがポイント。
  3. 日本語なら外側から、英語なら内側から読む。

優先度(上ほど強く結合)

記号 説明
() 宣言のグループ化
[], () 配列、関数引数
* ポインタ
その他 intなど

例: signalの型

void (*signal (int sig, void (*handler)(int)))(int);

  1. 最左の識別子はsignal。(sigとhandlerは引数)。
  2. signalからカッコをつける。

    1. *より()の方が強いので、signal (int sig, void (*handler)(int)) をカッコで囲む。
    2. 一番左のvoidより一番右の (int) の方が強いので、一番左の void 以外をカッコで囲む。
    3. 結果はこうなる。
      void ((*(signal (int sig, void (*handler)(int))))(int));
  3. 外側からカッコを外しながら読む。

    1. void ⚫; ⚫はvoid
    2. void (⚫)(int); ⚫はvoidを返す関数(引数はint
    3. void (* ⚫)(int); ⚫はvoidを返す関数(引数はint)へのポインタ
    4. void (*signal(⚫))(int); signalはvoidを返す関数(引数はint)へのポインタを返す関数(引数は⚫)
    5. void (*signal(int sig, void (*handler)(int)))(int); signalはvoidを返す関数(引数はint)へのポインタを返す関数(引数はintとvoidを返す関数(引数はint)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください