Почему offsetof возвращает size_t вместо uintptr_t?
Я заметил мою реализацию offsetof:
#define offsetof(st, m) ((size_t)&(((st *)0)->m))
Возвращает size_t
, но я думаю, что это должно быть uintptr_t
вместо этого, поскольку значение offsetof будет использоваться, скорее всего, для увеличения указателя.
У меня есть эта функция:
int flash_seek(intptr_t offset32, int whence);
Он перемещает внутренний указатель FLASH в другое место. Так offset32
это смещение. Если я хочу переместить мой указатель со смещения структуры:
flash_seek(offsetof(foo_t, bar), SEEK_CUR);
Я получаю предупреждение, потому что uintptr_t
не тот же тип, что и size_t
, Как мне исправить это, если я не хочу добавлять актеров?
1 ответ
size_t
это целочисленный тип без знака, который может содержать размер самого большого объекта в вашей системе.
Это делает его идеальным кандидатом для хранения того, что может быть смещением последнего члена в, возможно, самой большой структуре в вашей системе.
Он также должен быть определен для любой соответствующей реализации стандартной библиотеки языка C. uintptr_t
не является обязательным.
uintptr_t
также предназначен для хранения адресов, преобразованных в целочисленные значения. Он должен содержать абсолютное местоположение, а не смещение от неуказанного местоположения. Кроме того, стандарт не устанавливает требований о том, как address->integral value->address
должно быть сделано. Требуется только, чтобы адрес был одинаковым на обоих концах.
Ответ, почему в основном сводится к size_t
а также uintptr_t
быть абстракциями для совершенно разных вещей, где первое должно быть определено.