Подтвердить что ты не робот

Что такое typedef?

Каково использование ключевого слова typedef в C? Когда это необходимо?

4b9b3361

Ответ 1

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

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

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

THINGY t;

... а не:

struct _THINGY_STRUCT {
  int a;
  int b;
};

struct _THINGY_STRUCT t;

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

Ответ 2

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

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

и

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

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

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

Ответ 3

Typedef используется для создания псевдонимов для существующих типов. Это немного misnomer: typedef не определяет новые типы, так как новые типы взаимозаменяемы с базовым типом. Typedefs часто используются для ясности и переносимости в определениях интерфейсов, когда базовый тип может быть изменен или не имеет значения.

Например:

// 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

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

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

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

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

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

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

Мы можем сделать вышеуказанное выражение понятным, используя 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);
}

Ответ 7

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