Hiểu cho đúng về từ khóa typedef trong ngôn ngữ C

Thông thường, chúng ta vẫn cho rằng cú pháp của typedef là:

typedef OldType NewType;

Nó đúng với hầu hết các trường hợp phổ biến, ví dụ:

typedef int my_int;
my_int x;

Nhưng cú pháp ấy sẽ không giải thích được cho các cách viết sau:

typedef int my_int, his_int, her_int;
my_int my;
his_int his;
her_int her;

typedef int (*func)(int);
func f;

typedef int pa[50];
pa p;

Mặc dù viết như vậy hoàn toàn hợp lệ.

Cho nên ta phải tìm một cú pháp tổng quát phù hợp cho tất cả các cách viết trên.

Để ý rằng, phần phía sau typedef chính là một câu lệnh khai báo (declare) thực sự trong C. Mà đã là một câu lệnh khai báo thì phải có tính chất cho biết: các biến x1, y1, … cùng thuộc kiểu dữ kiệu A nào đó, các biến x2, y2, … cùng thuộc kiểu dữ liệu B nào đó, …

typedef đặt đầu câu sẽ làm cho các biến x1, y1, … (hoặc x2, y2, …) không còn là biến nữa mà trở thành kiểu dữ liệu A (hoặc B). Sau này khi khai báo biến a thuộc kiểu x1 (hoặc a thuộc kiểu y1, …) thì tức là a thuộc kiểu A. Tương tự cho x2, y2, … với kiểu B.

Nói cách khác, trong câu lệnh P có typedef, hãy bỏ typedef đi để được câu lệnh Q, thấy có biến a trong Q, thì sau này ở câu lệnh R, biến x thuộc kiểu a sẽ được đối xử như chính biến a trong Q (biến x có kiểu giống hệt kiểu của biến a).

Advertisements

2 thoughts on “Hiểu cho đúng về từ khóa typedef trong ngôn ngữ C

  1. Như vậy là
    typedef int pa[50];
    hoàn toàn tương đương với
    typedef int pa;
    và việc ghi thêm [50] ở trên là dư thừa (nhưng không sai)?

    Like

    1. 2 câu bạn nêu khác nhau hoàn toàn mà; cái đầu là khai báo mảng 50 phần tử int, vậy nên pa là 1 con trỏ; cái sau thì khai báo 1 biến tên pa kiểu int bình thường, ko phải là con trỏ.

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s