Целесообразно ли использовать intptr_t
в качестве хранилища общего назначения (для хранения указателей и целочисленных значений) вместо void*
?
Нет.
intptr_t
не гарантируется.Во-первых, как вы заметили, он был представлен в C99.Во-вторых, реализациям не требуется иметь достаточно большой целочисленный тип для хранения преобразованных значений указателя без потери информации.
Преобразование int
в intptr_t
и обратно маловероятно потерятьинформация, но нет реальной гарантии, что intptr_t
шире, чем int
.
Если вы хотите сохранить значения указателя, сохраните их в объектах указателя.Для этого и нужны объекты-указатели.
Любой указатель на объект или неполный тип может быть преобразован в void*
и обратно без потери информации.Нет такой гарантии для указателей на функции - но любой тип указатель на функцию может быть преобразован в любой другой тип указатель на функцию и обратно без потери информации.(Я имею в виду стандарт C; я думаю, что POSIX предоставляет некоторые дополнительные гарантии.)
Если вы хотите сохранить целое число или значение указателя в том же объекте, первое, что вы должны сделать, это повторнопродумайте свой дизайн.Если вы уже сделали это и пришли к выводу, что действительно хотите это сделать, рассмотрите возможность использования объединения (и внимательно следите за тем, какое значение вы сохранили в последнее время).
Существуют APIкоторые используют аргумент void*
, чтобы разрешить передачу произвольных данных;см., например, функцию POSIX pthread_create()
.Это может быть использовано путем приведения целочисленного значения к void*
, но безопаснее передать адрес целочисленного объекта.