C/C++におけるtypedefキーワードの使い方のまとめ

2680 ワード

まず、typedefについて説明します.キーワードであり、データ型を別名として理解することができますが、#defineとは異なり、typedefはコンパイル中にコンパイラによって処理され、#defineはプリコンパイル命令であり、プリコンパイル期間にプリプロセッサによって処理されます.
typedefキーワードにはいろいろな使い方がありますが、以下にまとめてみましょう.
組み込みタイプ:
typedef int sizeArr;
void func(int* arrNum,sizeArr n){       //sizeArr == int

    for(int i=0;i
典型的な伝達配列の関数であり、パラメータ1は配列ヘッダ要素アドレスを受信し、パラメータ2は配列サイズ(要素個数)を受信し、もちろんパラメータ2はint nを使用することができる.代わりに、ここでsizeArrはintの別名ですが、int nを使います.この関数を呼び出すと,ユーザはパラメータ2が何を受信しているのかよく分からないがtypedefによって別名を定義することで,ユーザが一目瞭然にパラメータ2が配列サイズを受信していることを知ることができる.
次のようなコードがあります.
    typedef unsigned char BYTE;
    unsigned char Temp;          //#1
    BYTE Temp1;                  //#2
#1および#2の定義は等価であり、unsigned charタイプを頻繁に定義する必要がある場合、#2は#1の定義よりも便利であり、コードにおいても可読性#2は#1よりも優れているに違いない.またtypedefで定義された別名により、環境を変更するなど、コード内のすべてのintをlongまたは他のタイプに置き換える必要がある場合があり、手動で置き換えるのは非常に手間がかかり、エラーが発生する可能性があります.typedefでint別名を定義した後、コードでその別名を使用する場合は、typedef定義のここを変更するだけでよい.
また、いくつかのポインタ変数を定義する必要がある場合、C/C++を習ったばかりの学生は習慣性int a,b,cのためかもしれません.複数の変数を定義すると、ポインタを定義するときにもこう書く可能性があります.
    int* p1,p2;
は、実際には、intタイプを指すポインタ変数(p 1)とintタイプを指す変数(p 2)を定義し、p 2はポインタ変数ではない.
typedefは次のように定義できます.
typedef int* pNum;
pNum p1,p2;
pNumはint*の別名として、このコードは2つのポインタ(p 1とp 2)を定義しており、非常に便利です.
構造体(struct):
struct Temp{
        int Num1;
        int Num2;
};
C言語で、構造体変数を定義するには、次のように定義する必要があります.
struct Temp t1;
コードにこの構造体を多く定義する必要がある場合、定義文にstruct Tempを含める必要があるため、typedefを使用すると便利になります.次のコードを参照してください.
typedef struct Temp{
        int Num1;
        int Num2;
}TempNum;

TempNum t1;    //    struct Temp     
はこのように構造体を定義するたびに、その構造体別名TempNumで定義するだけでよい.
配列:
    char Str1[10];
    char Str2[10];
複数のcharタイプを定義し、要素の個数が同じ配列を定義する必要がある場合、上記のコードでそれぞれ定義すると面倒になる可能性があります.typedefは依然としてこの問題を解決することができます.
    typedef char STR[10];
    STR s1;
    STR s2;
は、2つの要素の個数が10のcharタイプ配列を定義するのに便利ではないでしょうか.
関数ポインタ:
2つの関数ポインタを受信する関数があるとします.
void f1(int n){
    /*
    .........
    */
}

void f2(int n){
    /*
    .........
    */
}

void Func(void(*s1)(int),void(*s2)(int)){   //      int        void     
    /*
    .........
    */
}
Func(f1,f2);
またはコードには、intとしてパラメータを定義し、voidを返す関数ポインタ変数を定義する必要がある場合が多いが、void(*s 1)(int)形式でこのタイプの関数ポインタ変数(s 1)を定義するのは面倒であり、typedefを使用すると便利になる.
typedef void(*SS)(int);
void Func(SS s1,SS s2){
    /*
    .........
    */
}
このFuncは、上のvoid Func(void(*s 1)(int)、void(*s 2)(int))と等価である.
以上、typedefの使い方についてまとめてみましたが、後で調べやすいですね~