web-dev-qa-db-ja.com

typedefの使用とは何ですか?

Cでtypedefキーワードを使用するのは何ですか?いつ必要ですか?

52
hks

typedef は、何かをtypeとして定義するためのものです。例えば:

typedef struct {
  int a;
  int b;
} THINGY;

... THINGYを指定された構造体として定義します。そうすれば、次のように使用できます。

THINGY t;

...のではなく:

struct _THINGY_STRUCT {
  int a;
  int b;
};

struct _THINGY_STRUCT t;

...これはもう少し冗長です。 typedefは、いくつかのことを劇的により明確にすることができます。特に、関数へのポインタです。

49
T.J. Crowder

ウィキペディアから:

typedefは、CおよびC++プログラミング言語のキーワードです。 typedefの目的は、既存の型に代替名を割り当てることです。ほとんどの場合、標準宣言が扱いにくく、混乱を招く可能性があるか、実装ごとに異なる可能性があります。

そして:

K&Rは、typedefを使用する2つの理由があると述べています。まず、プログラムの移植性を高める手段を提供します。プログラムのソースファイル全体に出現するすべての場所で型を変更する代わりに、1つのtypedefステートメントのみを変更する必要があります。第二に、typedefは複雑な宣言を理解しやすくします。

反対の議論:

彼(Greg K.H.)は、この手法はコードを不必要に難読化するだけでなく、プログラマーが単純に大きなタイプの構造であると誤って誤用することもあると主張しています。

30
Oded

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を使用することをお勧めします。

13
andyn

ウィキペディアから:「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);
}
4
shaul boyer

次の例で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.
    */
4
Amjad

typedefは新しい型を導入しませんが、型の新しい名前を提供するだけです。

TYPEDEFは次の用途に使用できます:

  1. 配列、構造体、ポインター、または関数を組み合わせるタイプ。

  2. 移植性を高めるために、必要なタイプtypedef。その後、異なるプラットフォームにコードを移植するときに、typedefでのみ変更を行って適切なタイプを選択します。

  3. typedefは、複雑な型キャストの単純な名前を提供できます。

  4. typedefは、名前のない型に名前を付けるためにも使用できます。そのような場合、typedefはそのタイプの唯一の名前になります。

注:-構造でTYPEDEFを使用する必要があります。不要な場合でも、常に構造定義でタグを使用します。

4
Coffee_lover
typedef unsigned char BYTE;

この型定義の後、たとえば、識別子BYTEは型unsigned charの省略形として使用できます。

BYTE b1、b2;

2
mirhpe danielle

別のタイプのエイリアスを作成できます。

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */
2
Thomas Bonini