Что делает следующий макрос? - PullRequest
0 голосов
/ 11 августа 2010

в исходном коде qemu у меня есть следующий макрос с именем offsetof.Кто-нибудь может сказать мне, что он делает?

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)

Используется следующим образом:

offsetof(CPUState, icount_decr.u32)

, где CPUState - структура.

Я думаю, что это дает смещение члена внутри структуры, ноЯ не уверен.

РЕДАКТИРОВАТЬ: Да, я узнал, что происходит.В определении CPUState был макрос, который я пропустил, который включал переменную icount_decr.

Ответы [ 3 ]

3 голосов
/ 11 августа 2010

Получает смещение члена структуры.Это делается путем приведения нулевого адреса к структуре этого типа с последующим получением адреса члена.

1 голос
/ 11 августа 2010

Ваше мышление правильно!И название макроса тоже дает хороший намек.;)

0 голосов
/ 11 августа 2010

Это определено в §7.17 / 3:

offsetof(type, member-designator)
, которое расширяется до целочисленного константного выражения типа size_t, значением которого является смещение в байтах,члену структуры (обозначается обозначение члена ), с начала его структуры (обозначается тип ).Тип и обозначение элемента должны быть такими, чтобы с учетом
static type t;
выражение &(t.member-designator) преобразовывалось в адресную константу.(Если указанный член является битовым полем, поведение не определено.)

Поскольку библиотека не обязательно должна следовать языковым правилам, реализация может получить результат, как пожелает.

Таким образом, результатом этой конкретной реализации является , а не неопределенное поведение, потому что вы не должны заботиться о том, как оно реализовано.(Другими словами, ваша реализация дает гарантию того, что получение адреса косвенной адресации через нулевой указатель четко определено. Вы, конечно, не можете предположить это в своих собственных программах.)

Если это какая-то библиотека(пере) определил offsetof, они сделали поведение вашей программы неопределенным и должны вместо этого использовать стандартную библиотеку.(Чайники.)

...