Việc sử dụng từ khóa typedef trong C là gì? Khi nào cần thiết?Việc sử dụng typedef là gì?
Trả lời
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.
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.
Nó có thể bí danh một loại khác.
typedef unsigned int uint; /* uint is now an alias for "unsigned int" */
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
.
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 để:
loại kết hợp mảng, cấu trúc, con trỏ hoặc các chức năng.
Để 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.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.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.
Bạn có thể mở rộng không sử dụng typedef với cấu trúc không? –
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);
}
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.
*/
- 1. Việc sử dụng "??" là gì?
- 2. typedef trong Dart là gì?
- 3. Việc sử dụng window.external là gì?
- 4. Việc sử dụng LOCAL_MODULE_TAGS là gì?
- 5. Việc sử dụng Deployment.Current.Dispatcher.BeginInvoke (() => {...}) là gì?
- 6. Việc sử dụng singletonList là gì?
- 7. Việc sử dụng udevadm là gì?
- 8. việc sử dụng string.Clone() là gì?
- 9. Việc sử dụng plist là gì?
- 10. Việc sử dụng "khoan dung" là gì?
- 11. Việc sử dụng AtomicReferenceArray là gì?
- 12. Việc sử dụng Indexers là gì?
- 13. Sử dụng hợp lệ typedef?
- 14. Ý nghĩa của typedef này là gì?
- 15. Lợi thế của việc sử dụng arrayWithCapacity so với việc sử dụng mảng là gì?
- 16. Việc sử dụng Array.prototype.slice.call (mảng, 0) là gì?
- 17. Việc sử dụng các automata hữu hạn là gì?
- 18. Việc sử dụng Invoke() trong .net là gì?
- 19. việc sử dụng tệp .CSProj và .Sln là gì?
- 20. Việc sử dụng data-role = "fieldcontain" là gì?
- 21. Việc sử dụng HeaderedContentControl trong wpf là gì?
- 22. Việc sử dụng DECIMAL (x, 0) là gì?
- 23. Việc sử dụng cú pháp: = cú pháp là gì?
- 24. Việc sử dụng ". @" Trong tiếng groovy là gì?
- 25. Việc sử dụng giao diện IClonable trong .NET là gì?
- 26. Việc sử dụng ^: động trên xác thực là gì?
- 27. Việc sử dụng quyền Android Wake Lock là gì?
- 28. Điểm của việc sử dụng UDP với NIO là gì?
- 29. Eclipse Juno - Việc sử dụng package-info.java là gì?
- 30. Việc sử dụng thẻ túi trong Hibernate là gì?
Có một lý do nào để không 'gõ'' một' cấu trúc'? – Panzercrisis
@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). –