Почему 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 быть абстракциями для совершенно разных вещей, где первое должно быть определено.

Другие вопросы по тегам