Что именно делает этот макрос? - PullRequest
5 голосов
/ 16 февраля 2012
#define offsetof(type, member)  ((size_t)(&((type *)0)->member))

Я не понимаю (&((type *)0)->member) что это мне точно говорит .....

здесь тип может быть структурой или чем-то еще ?? ...

Точнее, что это 0 говорит мне здесь?

Ответы [ 3 ]

6 голосов
/ 16 февраля 2012

Это для определения смещения поля структуры. Он работает, используя 0 в качестве адреса структуры, а затем запрашивая адрес поля:

(type *)0

равно 0 в качестве указателя на type

&((type *)0)->member

является адресом member члена этой гипотетической структуры. Если адрес структуры равен 0, то адрес члена совпадает со смещением от начала структуры.

((size_t)(&((type *)0)->member))

- это адрес, приведенный к size_t для правильного типа смещения.

3 голосов
/ 16 февраля 2012

Макрос приводит адрес (0) к объявленному типу («тип»), затем обращается к полю («член») и получает адрес.В результате адрес поля, смещение от адреса 0, дает смещение от начала типа (структура / объединение) к полю.

2 голосов
/ 16 февраля 2012

Я разбиваю это так:

  1. (type *)0 - приведение 0 к указателю типа "type". т.е. на минуту представьте, что по адресу памяти 0.

  2. ->member - посмотрите на объект для поля с именем member.

  3. & - взять адрес этого.

Вы также можете написать это так:

((size_t)((&((type *)x)->member) - x))

Но мы обманываем и используем 0, чтобы в конце не было смещения.

...