В исходном коде qemu у меня есть следующий макрос с именем offsetof
. Может ли кто-нибудь сказать мне, что он делает?Что делает следующий макрос?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
Он используется таким образом:
offsetof(CPUState, icount_decr.u32)
где CPUState является структурой.
Я думаю, что это дает смещение члена внутри структуры, но я не уверен.
EDIT: Да, я узнал, что происходит. У определения CPUState был макрос внутри, который я пропустил, включая переменную icount_decr.
http://en.wikipedia.org/wiki/Offsetof –
Макрос технически запускает неопределенное поведение, но, случается, работает во многих местах. Современный (например, GCC 4) '' определит его компилятору, чтобы избежать неопределенности, а также некоторых головных болей на C++. –
zwol
@ Zack: Как я уже сказал в ответ, это функция библиотеки, поэтому нет, это не неопределенное поведение. Внедрение может свободно реализовать его, но они хотят. (По сути, эта конкретная реализация заставляет определять адрес разыменованного нулевого указателя для конкретного компилятора.) – GManNickG