■新しい型名の定義

Last modified: Fri Jun 08 2018
このページは,基礎工学部システム科学科機械科学コース2年生向けの 「コンピュータ基礎演習」における演習4の教材の1つです.

●typedef

「typedef」を使うと,既存の型に別の型名を付けることができる.

「typedef」を使って定義された型名は,既存の型と全く同じように使うことができる.

    typedef  型の定義  新型名;
    (例)
    typedef double real;           ← 新しい型の定義

    real   f(real x);             ← 関数のプロトタイプ宣言
    real   a, b, c, d[100], *p1;  ← 変数宣言
    real   f(real x)              ← 関数の定義
    {
        retrun x*x;
    }

既存の型に対してtypedefを使うのは特別な目的の場合だけだろう.

●構造体に対するtypedef

typedef は,構造体に対して使うことが多い.これによって,structという 「内部事情」を隠してしまって,プログラムの「意味」を浮き立たせることができ, 「読みやすさ」「書きやすさ」が向上する.

    struct タグ名 {
        型名1  メンバ名1;
        型名2  メンバ名2;
        ...;
     };
    typedef struct タグ名 型名;
    (例)
    struct complexTag {
        double re;
        double im;
    };
    typedef struct complexTag complex;

タグ名と型名は同じ名前でも良い.

タグ名を省略して, テンプレートの宣言と型名の定義を一緒に書くこともできる. これは,便利なのでよく使う.

    typedef struct {
        型名1  メンバ名1;
        型名2  メンバ名2;
        ...;
     } 型名;
    (例)
    typedef struct {
        double re;
        double im;
    } complex;

このように定義された型名は,既存の型と全く同じように使うことができる.

    (例)
    complex f(complex x);          ← 関数のプロトタイプ宣言
    complex a, b, c, d[100], *p1;  ← 変数宣言
    complex f(complex x)           ← 関数の定義
    {
        complex y;
        y.re = x.re*x.re - x.im*x.im;
        y.im = 2*x.re*x.im;
        return y;
    }

ただし,後述する自己参照構造体では,タグ名を省略できない.

例4-3 example43.c

typedef struct {                           ←構造体と型名の定義
    int   n;    /* 分子 (numerator) */
    int   d;    /* 分母 (denominator) */
} fraction;

(中略)

int
main(void)
{
    fraction    x1, x2, x3;

    x1 = fracMake(3, 4);                                     ← 代入
    x2 = fracMake(5, -6);                                    ← 代入
    printf("x1 = "); fracPrint(x1); printf("\n");            ← 表示
    printf("x2 = "); fracPrint(x2); printf("\n");            ← 表示

    x3 = fracAdd(x1, x2);                                    ← 足し算
    printf("x1 + x2 = "); fracPrint(x3); printf("\n");       ← 表示

    x3 = fracMul(x1, x2);                                    ← 掛け算
    printf("x1 * x2 = "); fracPrint(x3); printf("\n");       ← 表示

    x3 = fracAdd(fracMul(x1, x1), fracMul(x2, x2));          ← 混合計算
    printf("x1*x1 + x2*x2 = "); fracPrint(x3); printf("\n"); ← 表示
}
(後略)

[演習4のインデックス] [前の教材(構造体の基本)] [次の教材(構造体へのポインタと関数)]
hirai@me.es.osaka-u.ac.jp