Cでtypedefキーワードを使用するのは何ですか?いつ必要ですか?
typedef
は、何かをtypeとして定義するためのものです。例えば:
typedef struct {
int a;
int b;
} THINGY;
... THINGY
を指定された構造体として定義します。そうすれば、次のように使用できます。
THINGY t;
...のではなく:
struct _THINGY_STRUCT {
int a;
int b;
};
struct _THINGY_STRUCT t;
...これはもう少し冗長です。 typedefは、いくつかのことを劇的により明確にすることができます。特に、関数へのポインタです。
ウィキペディアから:
typedefは、CおよびC++プログラミング言語のキーワードです。 typedefの目的は、既存の型に代替名を割り当てることです。ほとんどの場合、標準宣言が扱いにくく、混乱を招く可能性があるか、実装ごとに異なる可能性があります。
そして:
K&Rは、typedefを使用する2つの理由があると述べています。まず、プログラムの移植性を高める手段を提供します。プログラムのソースファイル全体に出現するすべての場所で型を変更する代わりに、1つのtypedefステートメントのみを変更する必要があります。第二に、typedefは複雑な宣言を理解しやすくします。
反対の議論:
彼(Greg K.H.)は、この手法はコードを不必要に難読化するだけでなく、プログラマーが単純に大きなタイプの構造であると誤って誤用することもあると主張しています。
Typedefは、既存のタイプへのエイリアスを作成するために使用されます。それは少し misnomer :typedefは新しい型を定義しません。新しい型は基礎となる型と交換可能であるためです。基になる型が変更される場合や重要でない場合、インターフェイス定義の明確さと移植性のために、typedefがよく使用されます。
例えば:
// Possibly useful in POSIX:
typedef int filedescriptor_t;
// Define a struct foo and then give it a typedef...
struct foo { int i; };
typedef struct foo foo_t;
// ...or just define everything in one go.
typedef struct bar { int i; } bar_t;
// Typedef is very, very useful with function pointers:
typedef int (*CompareFunction)(char const *, char const *);
CompareFunction c = strcmp;
Typedefは、名前のない型に名前を付けるためにも使用できます。そのような場合、typedefがそのタイプの唯一の名前になります。
typedef struct { int i; } data_t;
typedef enum { YES, NO, FILE_NOT_FOUND } return_code_t;
命名規則は異なります。通常、trailing_underscore_and_t
またはCamelCase
を使用することをお勧めします。
ウィキペディアから:「K&Rは、typedefを使用する理由は2つあると述べています。最初の..。次に、typedefは複雑な宣言を理解しやすくします。」
次に、typedefを使用して複合型を単純化する2番目の理由の例を示します(複合型はK&Rの「Cプログラミング言語第2版p。136」から引用されています)。
char (*(*x([])())
xは、charを返す関数へのポインターのarray []へのポインターを返す関数です。
Typedefを使用して、上記の宣言を理解できるようにすることができます。以下の例をご覧ください。
typedef char (*pfType)(); // pf is the type of pointer to function returning
// char
typedef pfType pArrType[2]; // pArr is the type of array of pointers to
// functions returning char
char charf()
{ return('b');
}
pArrType pArr={charf,charf};
pfType *FinalF() // f is a function returning pointer to array of
// pointer to function returning char
{
return(pArr);
}
次の例でtypedefの使用を説明します。さらに、Typedefはコードを読みやすくするために使用されます。
#include <stdio.h>
#include <math.h>
/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/
// typedef a primitive data type
typedef double distance;
// typedef struct
typedef struct{
int x;
int y;
} point;
//typedef an array
typedef point points[100];
points ps = {0}; // ps is an array of 100 point
// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)
// prototype a function
distance findDistance(point, point);
int main(int argc, char const *argv[])
{
// delcare a function pointer
distanceFun_p func_p;
// initialize the function pointer with a function address
func_p = findDistance;
// initialize two point variables
point p1 = {0,0} , p2 = {1,1};
// call the function through the pointer
distance d = func_p(p1,p2);
printf("the distance is %f\n", d );
return 0;
}
distance findDistance(point p1, point p2)
{
distance xdiff = p1.x - p2.x;
distance ydiff = p1.y - p2.y;
return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
} In front of everything, place the keyword typedef.
*/
typedefは新しい型を導入しませんが、型の新しい名前を提供するだけです。
TYPEDEF
は次の用途に使用できます:
配列、構造体、ポインター、または関数を組み合わせるタイプ。
移植性を高めるために、必要なタイプtypedef
。その後、異なるプラットフォームにコードを移植するときに、typedefでのみ変更を行って適切なタイプを選択します。
typedef
は、複雑な型キャストの単純な名前を提供できます。
typedef
は、名前のない型に名前を付けるためにも使用できます。そのような場合、typedefはそのタイプの唯一の名前になります。
注:-構造でTYPEDEF
を使用する必要があります。不要な場合でも、常に構造定義でタグを使用します。
typedef unsigned char BYTE;
この型定義の後、たとえば、識別子BYTEは型unsigned charの省略形として使用できます。
BYTE b1、b2;
別のタイプのエイリアスを作成できます。
typedef unsigned int uint; /* uint is now an alias for "unsigned int" */