Có cách nào để tìm bù đắp của thành viên của cấu trúc tại thời gian biên dịch không? Tôi muốn tạo ra một hằng số chứa offset của một thành viên cấu trúc. Trong đoạn mã sau, macro offsetof()
hoạt động trong câu lệnh printf
đầu tiên. Tuy nhiên, việc sử dụng trong dòng 10 để khai báo sẽ tạo ra lỗi:offsetof tại thời gian biên dịch
"Cannot resolve '->' operator as a constant expression".
Còn cách nào khác để thực hiện?
struct MyStruct
{
unsigned long lw;
unsigned char c[5];
int i;
int j;
unsigned long last;
};
const int ofs = offsetof(struct MyStruct, i); // This line in error
int main(void)
{
printf("Offset of c = %d.\n", offsetof(struct MyStruct, c));
printf("Offset of i = %d.\n", ofs);
return 0;
}
Đó không phải là ý của anh ấy với "thời gian biên dịch", tất nhiên. Bạn hiển thị một cấu trúc không sử dụng hàm thư viện, nhưng điều đó không có nghĩa là nó đánh giá thành một giá trị thời gian biên dịch. Có hay không mã thực sự được phát ra không liên quan gì - bản nháp C nói "Biểu thức hằng số số học phải có kiểu số học và chỉ có toán hạng là hằng số nguyên, hằng số, hằng số liệt kê, hằng số ký tự và biểu thức sizeof.". Con trỏ không được phép trong hỗn hợp. –
'offsetof' là một thời gian biên dịch và đánh giá thành một biểu thức hằng số nguyên, nhưng việc triển khai ví dụ của bạn thì không. –
Có cách * NO * trong ngôn ngữ để định nghĩa offsetof() như một cái gì đó đánh giá thành một biểu thức hằng số nguyên. Có * NO * cách để xác định nó mà không cần sử dụng con trỏ. Bất kể bạn làm gì, bạn sẽ luôn dựa vào trình biên dịch của trình biên dịch và/hoặc khả năng của trình biên dịch để tối ưu hóa biểu thức của bạn một cách thích hợp. Kiểm tra Wikipedia trên offsetof, hoặc bất kỳ thư viện C mã nguồn mở nào. Vì vậy, trong khi bạn về mặt kỹ thuật chính xác về định nghĩa của các biểu thức hằng số nguyên (và tôi thích ứng từ ngữ của tôi), bạn đã sai khi chỉ một ngón tay vào việc thực hiện ví dụ của tôi. – DevSolar