C - pretypovani pointeru

Ladislav Vaiz spam na nagano.cz
Pondělí Březen 14 11:48:09 CET 2005


> Je vzdy sizeof(long) == sizeof(void *)? Pak by asi slo pouzit

Na to bych radeji nespolehal. Plati to na i386 i na amd64, ale imho mohou
existovat architektury, kde to neplati.


> int fd = (int)(long)arg; a dale
> register_callback(..., (void *)(long)fd);

Ja to resil zjistenim velikosti celociselnych typu a void * v configure.
Definoval jsem typ vint, ktery ma stejnou velikost jako void *.
Pretypovani pak delam pres onen vint.

configure.in:
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
test "$have_long_long" = yes && AC_CHECK_SIZEOF(long long, 8)
AC_CHECK_SIZEOF(void *)

header.h:
#undef vint
#if SIZEOF_SHORT == SIZEOF_VOID_P
typedef short vint;
#elif SIZEOF_INT == SIZEOF_VOID_P
typedef int vint;
#elif SIZEOF_LONG == SIZEOF_VOID_P
typedef long vint;
#elif defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == SIZEOF_VOID_P
typedef long long vint;
#else
#error You have no integer type of size void *
#endif

zdrojak.c:
int i = (vint)pointer;
void *p= (void *)(vint)integer;

Rad se necham poucit, pokud je zde nejaka chyba, kterou jsem prehledl.

La'd"a


Další informace o konferenci Linux