Vui lòng không sử dụng những thứ như "vps_t".
Đó là một sai lầm khi sử dụng typedef cho các cấu trúc và con trỏ. Khi bạn nhìn thấy một
vps_t a;
trong nguồn, nó có nghĩa là gì?
Ngược lại, nếu nó nói
struct virtual_container *a;
bạn thực sự có thể nói "a" là gì.
Nhiều người nghĩ rằng typedefs "giúp đọc". Không phải vậy. Chúng chỉ hữu ích cho:
(a) các đối tượng hoàn toàn mờ đục (trong đó typedef được sử dụng tích cực để che giấu đối tượng là gì).
Ví dụ: "pte_t", v.v. các đối tượng mờ mà bạn chỉ có thể truy cập bằng các hàm truy cập thích hợp.
GHI CHÚ! Bản thân và "chức năng truy cập" không tốt. Lý do chúng tôi có chúng cho những thứ như pte_t, vv là vì thực sự không có thông tin có thể truy cập được ở đó.
(b) Xóa các kiểu số nguyên, trong đó việc trừu tượng hóa giúp tránh nhầm lẫn cho dù đó là "int" hay "long".
u8 / u16 / u32 là typedefs hoàn toàn tốt, mặc dù chúng phù hợp với thể loại (d) tốt hơn ở đây.
GHI CHÚ! Một lần nữa - cần phải có một lý do cho việc này. Nếu một cái gì đó là "không dấu dài", thì không có lý do gì để làm
typedef unsigned long myflags_t;
nhưng nếu có một lý do rõ ràng về lý do tại sao nó trong một số trường hợp nhất định có thể là "int unsign" và trong các cấu hình khác có thể là "không dấu dài", thì bằng mọi cách hãy tiếp tục và sử dụng một typedef.
(c) khi bạn sử dụng thưa thớt để tạo ra một kiểu mới để kiểm tra kiểu.
(d) Các loại mới giống hệt với các loại C99 tiêu chuẩn, trong một số trường hợp đặc biệt.
Mặc dù sẽ chỉ mất một khoảng thời gian ngắn để mắt và não làm quen với các loại tiêu chuẩn như 'uint32_t', một số người vẫn phản đối việc sử dụng chúng.
Do đó, các loại 'u8 / u16 / u32 / u64' dành riêng cho Linux và các loại tương đương đã ký giống với các loại tiêu chuẩn được cho phép - mặc dù chúng không bắt buộc trong mã mới của riêng bạn.
Khi chỉnh sửa mã hiện có đã sử dụng một hoặc một nhóm loại khác, bạn nên tuân thủ các lựa chọn hiện có trong mã đó.
(e) Các loại an toàn để sử dụng trong không gian người dùng.
Trong một số cấu trúc nhất định có thể nhìn thấy đối với không gian người dùng, chúng tôi không thể yêu cầu các loại C99 và không thể sử dụng biểu mẫu 'u32' ở trên. Do đó, chúng tôi sử dụng __u32 và các loại tương tự trong tất cả các cấu trúc được chia sẻ với không gian người dùng.
Có thể có những trường hợp khác nữa, nhưng về cơ bản, quy tắc nên KHÔNG BAO GIỜ sử dụng typedef trừ khi bạn có thể khớp rõ ràng với một trong những quy tắc đó.
Nói chung, một con trỏ hoặc một cấu trúc có các phần tử có thể được truy cập trực tiếp một cách hợp lý không bao giờ nên là một typedef.