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