2010-04-02 41 views

Trả lời

24

Từ wikipedia:

typedef là một từ khóa trong các ngôn ngữ lập trình C và C++. Mục đích của typedef là gán các tên thay thế cho các kiểu hiện có, thường là những cái có khai báo chuẩn là cồng kềnh, có khả năng gây nhầm lẫn, hoặc có khả năng thay đổi từ việc triển khai này sang thực thi khác.

Và:

K & R khẳng định rằng có hai lý do cho việc sử dụng một typedef. Đầu tiên, nó cung cấp một phương tiện để làm cho một chương trình di động hơn. Thay vì phải thay đổi một loại ở mọi nơi nó xuất hiện trong các tệp nguồn của chương trình, chỉ cần thay đổi một câu lệnh typedef. Thứ hai, typedef có thể làm cho một khai báo phức tạp dễ hiểu hơn.

Và một cuộc tranh cãi chống lại:

Anh (Greg K.H.) lập luận rằng thực tế này không chỉ không cần thiết hoang mang mã, nó cũng có thể gây ra các lập trình viên vô tình lạm dụng các cấu trúc lớn nghĩ chúng là loại đơn giản.

35

typedef là để xác định điều gì đó là loại. Ví dụ:

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

... định nghĩa THINGY làm cấu trúc đã cho. Bằng cách đó, bạn có thể sử dụng nó như thế này:

THINGY t; 

... chứ không phải là:

struct _THINGY_STRUCT { 
    int a; 
    int b; 
}; 

struct _THINGY_STRUCT t; 

... đó là tiết hơn một chút. typedefs có thể làm cho một số thứ đáng kể rõ ràng hơn, đặc biệt cho các chức năng.

+1

Có một lý do nào để không 'gõ'' một' cấu trúc'? – Panzercrisis

+1

@Panzercrisis: Tôi không biết một, chắc chắn tôi đã làm nó thường xuyên ~ 1989-1998 (những năm tôi đã làm hầu hết công việc C của tôi), nhưng tôi không phải là một chuyên gia C (nữa). –

3

Nó có thể bí danh một loại khác.

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

Typedef được sử dụng để tạo bí danh cho các loại hiện có. Đó là một chút của một misnomer: typedef không định nghĩa các kiểu mới vì các kiểu mới có thể hoán đổi cho nhau với kiểu cơ bản. Typedef thường được sử dụng cho sự rõ ràng và tính di động trong các định nghĩa giao diện khi kiểu cơ bản có thể thay đổi hoặc không quan trọng.

Ví dụ:

// 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 cũng có thể được sử dụng để cung cấp cho tên với các loại vô danh. Trong những trường hợp như vậy, typedef sẽ là tên duy nhất cho loại đã nói:

typedef struct { int i; } data_t; 
typedef enum { YES, NO, FILE_NOT_FOUND } return_code_t; 

Quy ước đặt tên khác nhau. Thông thường, bạn nên sử dụng trailing_underscore_and_t hoặc CamelCase.

3

typedef doesnot giới thiệu loại mới nhưng nó chỉ cung cấp tên mới cho một loại.

TYPEDEF thể được dùng để:

  1. loại kết hợp mảng, cấu trúc, con trỏ hoặc các chức năng.

  2. Để tạo thuận lợi cho tính di động, typedef loại bạn yêu cầu. Khi bạn chuyển mã sang nền tảng khác, hãy chọn loại phù hợp bằng cách chỉ thực hiện thay đổi trong typedef.

  3. A typedef có thể cung cấp tên đơn giản cho dàn diễn viên kiểu phức tạp.

  4. typedef cũng có thể được sử dụng để đặt tên cho các loại chưa đặt tên. Trong trường hợp này, typedef sẽ là tên duy nhất cho loại đã nói.

LƯU Ý: -should not SỬ DỤNG TYPEDEF với cấu trúc. LUÔN LUÔN SỬ DỤNG TAG TRONG MỘT CẤU TRÚC CẤU TRÚC KHI NÀO NẾU KHÔNG CẦN.

+2

Bạn có thể mở rộng không sử dụng typedef với cấu trúc không? –

3

từ Wikipedia: "K & R nói rằng có hai lý do để sử dụng typedef. Đầu tiên ... Thứ hai, typedef có thể làm cho một khai báo phức tạp dễ hiểu hơn".

Dưới đây là một ví dụ để lý do thứ hai của việc sử dụng typedef, đơn giản hóa các loại phức tạp (kiểu phức tạp được lấy từ K & R "Ngôn ngữ lập trình C thứ hai phiên bản p. 136).

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

x là một hàm trả về con trỏ đến mảng [] của con trỏ đến hoạt động trở lại char.

Chúng tôi có thể làm cho việc khai báo trên có thể hiểu được sử dụng typedefs. Hãy xem ví dụ dưới đây.

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); 
} 
1

Giải thích việc sử dụng typedef trong ví dụ sau. Hơn nữa, Typedef được sử dụng để làm cho mã dễ đọc hơn.

#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. 
    */ 
Các vấn đề liên quan