Правильное решение вашей проблемы - использовать стандартные заголовки C99:
#include <stdint.h>
#include <inttypes.h>
Вам нужен только один из двух, потому что #include <inttypes.h>
включает материал из #include <stdint.h>
;тем не менее, большая часть материала в <inttypes.h>
относится только к форматированному вводу / выводу с scanf()
и printf()
.
При условии предполагаемого условия:
#if (sizeof(void*) <= sizeof(unsigned int)) // what goes here?
# define POINTER_FITS_INTO_UINT
#endif
То, к чему вы стремитесь, известно как:
uintptr_t
Это целочисленный тип без знака, который достаточно большой, чтобы содержать любой указатель (то есть любой указатель данных в стандарте C; POSIX).накладывает дополнительное правило, которое также должно быть достаточно большим, чтобы также содержать указатели на функции).Тип uintptr_t
определен в <stdint.h>
.
Если вы впоследствии собираетесь печатать такие значения или необработанные указатели, вы можете использовать информацию из <inttypes.h>
:
printf("Pointer = 0x%" PRIXPTR "\n", uintptr_value);
printf("Pointer = 0x%" PRIXPTR "\n", (uintptr_t)any_pointer);