第16章の1 typedef

この章では、「typedef」、「union」、「enum」を取り上げます。

1. typedefの概要

「typedef」は既にある型に対して新しい型名を作成するもので、次のように記述します。

typedef 既にある型 新しい型名;

たとえば、typedef がよく使われるものにビット列があります。 ビット演算をする場合には演算対象の変数は「unsigned(符号なし)」であることが条件ですが、このunsigned型をビット演算の対象である事を強調して次のように宣言したりします。

typedef unsigned char BYTE; と宣言しておくと、このあとは
BYTE data; と宣言できます。これは、
unsigned char data; と宣言することと全く同じです。

また、第15章で学習した構造体では、頭に「struct」が付くのでどうしても型名が長くなります。 そのため、構造体の宣言を簡潔にするために、typedef は非常に多く用いられます。

第15章の1 構造体」で用いたプログラムを typedef を用いて書きなおすと次のようになります。

#include <stdio.h>

typedef struct {
    int no;         // 学生番号
    char name[20];  // 氏名
    double average; // 平均値
} SEISEKI;

int main(void)
{
    SEISEKI seito1 = {5, "KASAHARA", 83.5};
    SEISEKI seito2[20] = {
        {1, "SAKURAI", 78.6},
        {2, "NAGANO", 57.3},
        {3, "TAKESHITA", 66.4},
    };
    
    printf("%d %s %5.1f\n\n",seito1.no,seito1.name,seito1.average);
    for(int i = 0; i < 3; i++) {
        printf("%d %s %5.1f\n", seito2[i].no, seito2[i].name, seito2[i].average);
    }
    
    return 0;
}

【実行結果例】
5 KASAHARA 83.5

1 SAKURAI 78.6
2 NAGANO 57.3
3 TAKESHITA 66.4

2. typedef 使用上の注意

  1. typedef は新しい型を作り出すのではなく、既存の型に新しい名前を付け加えるだけである。
  2. #defineと似ているが、#define はプリプロセッサにより解釈され、typedef はコンパイラにより解釈される。また、単に同義語を作る#defineに比べ、typedef は「型」の同義語を作るという目的が明確である。
  3. 宣言場所を注意しないと、他の関数から見えないことが起こる。

〇 演習問題

1. 関数に構造体を渡す (1) 値渡し」のサンプルプログラムの構造体宣言を「typedef」を用いて書き換えなさい。

【実行結果例】
1001 中田太郎 76.5

解答例

#include <stdio.h>

// 構造体の宣言
typedef struct {      // 成績データ
    int no;           // 学生番号
    char name[20];    // 名前
    double avg;       // 平均点
} SEISEKI;

void seidesp1(SEISEKI sei);

int main(void)
{
    SEISEKI seito1 = {1001, "中田太郎", 76.5};

    seidesp1(seito1);
    
    return 0;
}

void seidesp1(SEISEKI sei)
{
    printf("%d %s %.1f\n", sei.no, sei.name, sei.avg);
}

コメント