Trao đổi với tôi

http://www.buidao.com

3/27/10

[Programming] SỰ TINH TẾ CỦA TYPEDEF

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.

(theo baohoclaptrinh.com)