2012-11-19 28 views
5

thay vì xác định container_of như:định nghĩa của container_of vĩ mô

#define container_of(ptr, type, member) ({ \ 
      const typeof(((type *)0)->member) *__mptr = (ptr); 
      (type *)((char *)__mptr - offsetof(type,member));}) 

Tại sao sẽ không chỉ đơn giản là làm việc này:

#define container_of(ptr, type, member) ({ \ 
        (type *)((char *)(ptr) - offsetof(type,member));}) 

việc sử dụng dòng đầu tiên trong định nghĩa là gì?

Trả lời

7

Nó bổ sung một số mức độ an toàn kiểu. Với phiên bản thứ hai của bạn, tôi có thể vượt qua bất cứ điều gì trong cho ptr và nó sẽ biên dịch tốt. Với phiên bản của hạt nhân, bạn sẽ ít nhất nhận được cảnh báo nếu bạn chuyển một con trỏ cho ptr không khớp với loại type.member.

Các vấn đề liên quan