Mặc dù đó là một việc thực hiện đặc trưng của offsetof
, nó không ra lệnh tiêu chuẩn, mà chỉ nói:
Các loại và macro sau được định nghĩa trong header chuẩn <stddef.h>
[...]
offsetof(
type
,
member-designator
)
mà mở rộng để một biểu thức hằng số nguyên mà có kiểu size_t
, giá trị của được bù đắp bằng byte, để các thành viên kết cấu (do member-designator
), từ đầu cấu trúc của nó (do type
). Loại và thành viên vấn thiết kế phải đảm bảo để cho
static
type
t;
thì biểu thức &(t.
member-designator
)
kết quả là một hằng số địa chỉ. (Nếu thành viên quy định là một trường bit, hành vi này là không xác định.)
đọc PJ Plauger của "Tiêu chuẩn C Thư viện" cho một cuộc thảo luận về nó và các mặt hàng khác trong <stddef.h>
đó là tất cả các tính năng biên giới-line có thể (nên?) được trong ngôn ngữ thích hợp, và có thể yêu cầu hỗ trợ trình biên dịch đặc biệt.
Đó chỉ là sự quan tâm lịch sử, nhưng tôi đã sử dụng trình biên dịch ANSI C ban đầu trên 386/IX (xem, tôi đã nói với bạn về lãi suất lịch sử, vào khoảng năm 1990) đã bị lỗi trên phiên bản offsetof
nhưng làm việc khi tôi sửa đổi nó thành:
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
Đó là lỗi trình biên dịch các loại, ít nhất vì tiêu đề được phân phối với trình biên dịch và không hoạt động.
Nguồn
2009-04-03 14:39:38
Đây có phải là câu hỏi đầu tiên tôi thấy trên SO phàn nàn về mã hoạt động không? :-) – paxdiablo
Có người đó với nếu (0) {asm (nop)} nơi để nó ra làm một cái gì đó thất bại ... – RBerteig
ANSI C (thực sự ISO C) không xác định định nghĩa này cho 'offsetof'. Nó chỉ đơn thuần chỉ rõ cách nó phải hành xử như thế nào. Định nghĩa thực tế là tùy thuộc vào từng triển khai và có thể thay đổi triển khai thực hiện này sang cài đặt khác. –