Какая польза от typedef? - PullRequest
       15

Какая польза от typedef?

52 голосов
/ 02 апреля 2010

Какая польза от ключевого слова typedef в C? Когда это нужно?

Ответы [ 8 ]

48 голосов
/ 02 апреля 2010

typedef для определения чего-либо типа . Например:

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

... определяет THINGY как данную структуру. Таким образом, вы можете использовать его так:

THINGY t;

... а не:

struct _THINGY_STRUCT {
  int a;
  int b;
};

struct _THINGY_STRUCT t;

... что немного более многословно. typedefs может сделать некоторые вещи значительно более понятными, особенно указатели на функции.

30 голосов
/ 02 апреля 2010

Из википедии:

typedef - ключевое слово в языках программирования C и C ++. Цель typedef - присвоить альтернативные имена существующим типам, чаще всего тем, чье стандартное объявление громоздко, потенциально сбивает с толку или может варьироваться от одной реализации к другой.

И

K & R заявляет, что есть две причины для использования typedef. Во-первых, это дает возможность сделать программу более переносимой. Вместо того, чтобы менять тип везде, где он появляется в исходных файлах программы, нужно изменить только один оператор typedef. Во-вторых, typedef может облегчить понимание сложной декларации.

И аргумент против:

Он (Грег К.Х.) утверждает, что эта практика не только излишне запутывает код, но также может заставить программистов случайно неправильно использовать большие структуры, считая их простыми типами.

13 голосов
/ 24 сентября 2012

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.

4 голосов
/ 12 января 2017

Объяснение использования 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 голосов
/ 28 июня 2016

из Википедии: «K & R утверждает, что есть две причины для использования typedef. Во-первых ... Во-вторых, typedef может облегчить понимание сложной декларации».

Вот пример второй причины использования typedef, упрощающего сложные типы (сложный тип взят из K & R "Второе издание языка программирования C, стр. 136).

char (*(*x([])())

x - функция, возвращающая указатель на массив [] указателя на функцию, возвращающую символ.

Мы можем сделать вышеуказанное объявление понятным, используя typedefs. Пожалуйста, смотрите пример ниже.

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 голосов
/ 31 марта 2014

typedef не вводит новый тип, а просто предоставляет новое имя для типа.

TYPEDEF МОЖЕТ ИСПОЛЬЗОВАТЬСЯ ДЛЯ:

  1. Типы, которые объединяют массивы, структуры, указатели или функции.

  2. Чтобы упростить переносимость, typedef требуемый тип. Затем при переносе кода на разные платформы выберите нужный тип, внеся изменения только в typedef.

  3. A typedef может предоставить простое имя для сложного типа приведения.

  4. typedef также может использоваться для присвоения имен безымянным типам. В таких случаях typedef будет единственным именем для указанного типа.

ПРИМЕЧАНИЕ: - НЕОБХОДИМО ИСПОЛЬЗОВАТЬ TYPEDEF СО СТРУКТУРАМИ. ВСЕГДА ИСПОЛЬЗУЙТЕ ТЕГ В ОПРЕДЕЛЕНИИ СТРУКТУРЫ, ЕСЛИ ЕГО НЕ НУЖНО.

2 голосов
/ 03 ноября 2018
typedef unsigned char BYTE;

После этого определения типа идентификатор BYTE можно использовать как сокращение для типа unsigned char, например ..

БАЙТ b1, b2;

2 голосов
/ 02 апреля 2010

Может иметь псевдоним другого типа.

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */
...