Linux講座にようこそ。このページは「C言語プログラミング入門 - 第12章.その他の型」です。

C言語プログラミング入門

12. その他の型(3/4)

12.4 typedef

typedefはユーザ定義の型を作成するのに使用します。型を作成するといっても、既存の型に独自の型名を付けることと、既存の型を組み合わせたもの(構造体や共用体、等)に型名を付けることが出来るということで、まったく新しい型を作るということではありません。

構造体や共用体を使う場合、structやunionといった型指定子を指定しなければなりませんが、これが結構煩わしく感じるかもしれません。こういった場合、構造体や共用体にtypedefで型名を与えておけば、コーディングが楽になりますし、プログラムも理解しやすいものになります。

12.4.1 形式

typedefは既存の型名に対して独自の型名をつけます。既存の型として、構造体や共用体などを指定することも出来ます。

typedef 既存の型名 新しい型名;
typedef
新しい型名を宣言するための型指定子です。
既存の型名
C言語の仕様として定義されているint型やdouble型はもちろん、構造体や共用体なども指定できます。
新しい型名
上記、既存の型名に付ける型名です。

12.4.2 例題

肥満度を計算して正常・異常を判定して結果を出力します。肥満度情報を格納する構造体に対して、typedefでBMIという型名を宣言しています。

  1. #include <stdio.h>
  2. /* 肥満の状態を表すフラグ */
  3. enum judge_type
  4. {
  5.     BMI_NORMAL,                    /* 正常 */
  6.     BMI_UNDER,                     /* 低い */
  7.     BMI_OVER,                      /* 高い */
  8.     BMI_ERROR                      /* 判定不可 */
  9. };
  10. /* 肥満度データを格納する構造体(型名はBMI) */
  11. typedef struct
  12. {
  13.     int                number;     /* 番号 */
  14.     double             weight;     /* 体重 */
  15.     double             height;     /* 身長 */
  16.     double             bmi;        /* 肥満度 */
  17.     enum judge_type    judge;      /* 肥満状態 */
  18. } BMI;
  19.  
  20. int main(void)
  21. {
  22.     BMI     bmi_data;
  23.     int     return_code = 0;
  24.     /* CalcBmiEx関数のプロトタイプ宣言 */
  25.     void CalcBmiEx(BMI *Bmi);
  26.  
  27.     printf("肥満度(BMI)の計算を行います\n");
  28.     printf("体重(kg)と身長(cm)を入力してください ==> ");
  29.     scanf("%lf%lf", &bmi_data.weight, &bmi_data.height);
  30.  
  31.     CalcBmiEx(&bmi_data);
  32.     printf("肥満度は%.2fです。", bmi_data.bmi);
  33.     switch(bmi_data.judge)
  34.     {
  35.         case BMI_NORMAL:
  36.             printf("正常です。\n");
  37.             break;
  38.         case BMI_UNDER:
  39.             printf("低すぎます。\n");
  40.             break;
  41.         case BMI_OVER:
  42.             printf("高すぎます。\n");
  43.             break;
  44.         default:
  45.             printf("判定出来ません。\n");
  46.             return_code = 1;
  47.     }
  48.  
  49.     return return_code;
  50. }
  51.  
  52. /* 体重と身長を元に肥満度(BMI)の計算を行い、正常かどうかの判定を行う*/
  53. void CalcBmiEx(BMI  *pBmi)
  54. {
  55.     double  height;
  56.  
  57.     /* 体重と身長の値をチェック */
  58.     if (pBmi->weight > 0.0 && pBmi->height > 0.0)
  59.     {
  60.         /* 身長をセンチメートルからメートルに変換 */
  61.         height = pBmi->height / 100.0;
  62.         /* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
  63.         pBmi->bmi = pBmi->weight / height / height;
  64.         /* 肥満度が18.5〜25.5の範囲であれば正常 */
  65.         if(pBmi->bmi >= 18.5 && pBmi->bmi <= 25.0)
  66.         {
  67.             pBmi->judge = BMI_NORMAL;        /* 正常 */
  68.         }
  69.         else
  70.         {
  71.             if(pBmi->bmi > 25.0)
  72.             {
  73.                 pBmi->judge = BMI_OVER;      /* 高い */
  74.             }
  75.             else
  76.             {
  77.                 pBmi->judge = BMI_UNDER;     /* 低い */
  78.             }
  79.         }
  80.     }
  81.     else
  82.     {
  83.         pBmi->bmi = 0.0;
  84.         pBmi->judge = BMI_ERROR;
  85.     }
  86.  
  87.     return;
  88. }
$ ./ex12_3.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(cm)を入力してください ==> 67.5 188
肥満度は19.10です。正常です。
$
$ ./ex12_3.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(cm)を入力してください ==> 81.5 165.5
肥満度は29.76です。高すぎます。
$
11〜18行目
typedefを使って肥満度情報を格納する構造体に対して、BMIという型名を宣言します。以降、この構造体はBMIという型名を指定するだけで使用出来ます。なお、構造体型名を使うことはないため、省略しています。
22行目
型名BMIを使用して、肥満度情報を格納するための変数bmi_dataを宣言します。型指定子のstructを指定していない点に注目してください。
25行目
CalcBmiEx関数の関数プロトタイプ宣言ですが、引数の型名をBMIにします。
53行目
以降、CalcBmiEx関数の定義ですが、こちらも引数の型名をBMIにします。