typedef コマンド
導入
typedef
コマンドは、特定の型のエイリアスを作成するために使用されます。
typedef 型名。
上記のコードでは、「type」は型名を表し、「name」はエイリアスを表します。
typedef unsigned char BYTE;
バイト c = 'z';
上の例では、typedef
コマンドが型 unsign char
を BYTE
としてエイリアスするので、BYTE
を使用して変数を宣言できます。
typedef では、複数のエイリアスを一度に指定できます。
typedef int アンテロープ、ベーグル、マッシュルーム。
上記の例では、一度に 3 つのエイリアスが int
型に与えられています。
typedef はポインタにエイリアスを付けることができます。
typedef int* intptr;
int a = 10;
intptr x = &a;
上の例では、intptr
は int*
のエイリアスです。ただし、変数 x
がポインタ型であることがわかりにくいため、使用する場合は注意してください。
typedef は配列型のエイリアスにも使用できます。
typedef int four_ints[5];
Five_ints x = {11, 22, 33, 44, 55};
上の例では、「five_ints」は 5 つの整数を含む配列型です。
typedef は関数の別名として次のように記述します。
typedef signed char (*fp)(void);
上記の例では、型エイリアス fp
は関数 signed char (*)(void)
を表すポインターです。
主な利点
typedef
エイリアス型の利点には主に次の点が含まれます。
(1) コードの可読性が向上します。
typedef char* STRING;
文字列名;
上記の例では、文字ポインタを STRING
としてエイリアスします。今後、STRING
を使用して変数を宣言する場合、その変数を文字列として簡単に識別できます。
(2) struct、union、enum などのコマンドで定義される複雑なデータ構造に対してエイリアスを作成し、参照しやすくします。
構造体ツリーノード {
// ...
};
typedef struct Treenode* ツリー;
上記の例では、Tree
は structtreenode*
のエイリアスです。
typedef を struct コマンドと一緒に記述してデータ型を定義することもできます。
typedef 構造体動物 {
char* 名前;
int 脚数、速度;
} 動物;
上記の例では、データ型をカスタマイズするときに、typedef
コマンドを使用して、struct anime
にエイリアス animal
を与えます。
この場合、C言語ではstructコマンドに続く型名の省略が認められています。
typedef 構造体 {
文字 * 名前;
int 脚数、速度;
} 動物;
上記の例は、匿名データ型にエイリアス「animal」を与えるのと同じです。
(3) typedef を使用すると、後で変数の型を変更することが容易になります。
typedef float app_float;
app_float f1、f2、f3;
上記の例では、変数「f1」、「f2」、「f3」の型はすべて「float」です。後でタイプを変更する必要がある場合は、「typedef」ステートメントを変更するだけで済みます。
typedef long double app_float;
上記のコマンドは、変数 f1
、f2
、f3
の型を long double
に変更します。
(4) 携帯性
特定の値のタイプは、コンピュータによって異なる場合があります。
int i = 100000;
上記のコードは、32 ビット整数を使用するコンピュータでは問題ありませんが、16 ビット整数を使用するコンピュータではエラーが発生します。
C 言語での解決策は、「int32_t」など、異なるコンピュータでは異なる型として解釈される型のエイリアスを提供することです。
int32_t i = 100000;
上記の例では、変数 i
を型 int32_t
として宣言し、さまざまなコンピューター上で 32 ビット幅になり、コードの移植時にエラーが発生しないようにしています。
この型の型別名は typedef を使用して定義されます。以下に同様の例を示します。
typedef long int ptrdiff_t;
typedef unsigned long int size_t;
typedef int wchar_t;
これらの整数型のエイリアスは、ヘッダー ファイル stdint.h
に配置されます。異なるアーキテクチャのコンピューターでは、コードを変更せずに、このヘッダー ファイルを変更するだけで済みます。
したがって、「typedef」はコードの移植性を向上させ、さまざまなアーキテクチャのコンピュータに適応できるようにするのに役立ちます。
(5) 型宣言の簡略化
C 言語の型宣言の中には、次のような非常に複雑なものもあります。
char (*(*x(void))[5])(void);
typedef を使用すると、複雑な型宣言を簡素化し、理解しやすくすることができます。まず、最外層に型エイリアスを作成します。
typedef char (*Func)(void);
Func (*x(void))[5];
これでもまだ少し複雑に見えるので、内側の層のエイリアスを定義するだけです。
typedef char (*Func)(void);
typedef 関数 Arr[5];
Arr* x(void);
上記のコードは解釈しやすいです。
x
は、Arr 型へのポインタを返す関数です。Arr
は 5 つのメンバーを持つ配列で、各メンバーはFunc
型です。Func
は、パラメータを持たずに文字値を返す関数を指す関数ポインタです。
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0