Với người lập trình C, việc bắt gặp và sử dụng TypeDef không có gì là
lạ lẫm hay khó hiểu. Thế nhưng không phải ai cũng có thể thấy hết được
sự tiện lợi và hiệu quả trong việc sừ dụng typedef cũng như bản chất
bên trong của nó là gì. Chúng ta hãy cùng tìm hiểu vấn đề này.
Mọi
người đầu biết typedef đơn thuần là tạo thêm một tên mới cho một cho
kiểu dữ liệu có sẵn, có nghĩa là không tạo ra một kiểu dữ liệu mới. Ví
dụ :
typedef unsigned long int uli;
uli i, j;
unsigned long int x, y;
Trong
đọan mã khai báo trên, các biến i, j có kiểu hoàn tòan giống với biến
x, y. Thực ra, về mặt chức năng, typedef giống với #define. Ngoại trừ
một điều : lện typedef được thông dịch bởi trình biên dịch, nghĩa là
typedef có thể có được tính năng mà các lệnh tiền xử lý thông thường
không thể nào đạt đến.
Có 3 lý do khiến chúng ta dùng typedef :
1-
Các câu lệnh khai báo phức tạp sẽ được viết dễ dàng hơn bằng cách dùng
typedef. Với cách này, người lập trình loai trừ được phần lớn sự phức
tạp của chương trình. Việc sử dụng typedef hợp lý sẽ khiến chương trình
trong sáng hơn nhiều.
2- Hỗ trợ cho việc tạo các chương trình
linh hoạt, dễ di chuyển từ máy này sang máy khác. Nghĩa là, nếu dùng
typedef để định nghĩa một kiểu dữ liệu phụ thuộc vào một cấu trúc máy
nào đó, khi chương trình được đem đến một máy mới, chúng ta chỉ cần
thay đổi câu lệnh typedef tương ứng với kiểu dữ liệu trên máy này.
Ví
dụ minh họa cho tính năng này là dùng typedef định nghĩa kiểu đại diện
cho số nguyên (kích thước của kiểu này thay đổi phụ thuộc vào máy
tính), sau đó chúng ta sẽ lựa chọn một kiểu phù hợp (vd : short, long
hay int) tùy thuộc vào máy tính chứa chương trình.
3- Giúp
chương trình trở nên dễ đọc, dễ hiểu. Ví dụ : một nút của danh sách
liên kết đôi sẽ dễ hiểu hơn khi được viết dưới dạng ptr_to_list thay vì
là một con trỏ trỏ đến một cấu trúc phức tạp.
Bây giờ, chúng ta đề cập đến một vài nét tinh tế trong viêc sử dụng typedef. Hãy xem đoạn mã sau :
typedef char * string_t;
#define string_d char *;
string_t s1, s2;
string_d s3, s4;
Bạn có thể nhìn thấy được sự khác biệt của cách dùng typedef và #define ?
Trong
các câu lệnh khai báo trên, s1, s2 có kiểu là char*, nhưng s3, s4 có
kiểu là char (kiểu ký tự), không phải là char* như mong muốn. Vì vậy,
trong đa số trường hợp, typedef được ưa chuộng hơn #define vì nó có thể
mã hóa kiểu pointer một cách chính xác. Không những vậy, typedef còn có
ưu điểm là tuân theo các luật về tầm vực, nghĩa là typedef có thể được
khai báo một cách cục bộ bên trong một chương trình con hay một khối
lệnh trong khi #define luôn tạo ra môt tác động có tính toàn cục.
[Sưu tầm]