Çeşitli cevaplar üzerinde yoğunlaşmaktadır uintptr_t
ve #include <stdint.h>
'çözüm olarak. Bence cevabın bir parçası, ama cevabın tamamı değil. Ayrıca, FOO'nun ileti kimliği ile işlevin nerede çağrıldığına da bakmanız gerekir.
Bu kodu ve derlemeyi düşünün:
$ cat kk.c
#include <stdio.h>
static void function(int n, void *p)
{
unsigned long z = *(unsigned long *)p;
printf("%d - %lu\n", n, z);
}
int main(void)
{
function(1, 2);
return(0);
}
$ rmk kk
gcc -m64 -g -O -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith \
-Wcast-qual -Wstrict-prototypes -Wmissing-prototypes \
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE kk.c -o kk
kk.c: In function 'main':
kk.c:10: warning: passing argument 2 of 'func' makes pointer from integer without a cast
$
Çağıran konumda (içinde main()
) bir problem olduğunu gözlemleyeceksiniz - bir tamsayıyı, atamasız bir göstericiye dönüştürmek. function()
Değerlerin ona nasıl aktarıldığını görmek için tüm kullanımlarında analiz etmeniz gerekecek . function()
Aramalar yazılsaydı içimdeki kod çalışırdı :
unsigned long i = 0x2341;
function(1, &i);
Sizinki muhtemelen farklı yazıldığından, gösterilen değeri kullanmanın anlamlı olduğundan emin olmak için işlevin çağrıldığı noktaları gözden geçirmeniz gerekir. Unutmayın, gizli bir hata buluyor olabilirsiniz.
Ayrıca, void *
parametrenin değerini (dönüştürüldüğü gibi) biçimlendirecekseniz , <inttypes.h>
başlığa dikkatlice bakın (- yerine stdint.h
-inttypes.h
stdint.h
alışılmadık olan hizmetlerini sağlar , ancak C99 standardı [t] başlığının başlığı <inttypes.h>
içerdiğini <stdint.h>
ve bunu barındırılan uygulamalar tarafından sağlanan ek olanaklarla genişletir ) ve biçim dizelerinizde PRIxxx makrolarını kullanın.
Ayrıca, yorumlarım kesinlikle C ++ yerine C'ye uygulanabilir, ancak kodunuz C ve C ++ arasında taşınabilir olan C ++ alt kümesinde. Yorumlarımın geçerli olma şansı oldukça iyi.
size_t
i386 parçalı bellektir. 32 bit makinede rağmen,sizeof
döner2
içinsize_t
. Alex'in aşağıdaki cevabı doğru görünüyor. Alex'in cevabı veuintptr_t
hemen hemen her yerde çalışıyor ve artık standart. C ++ 11 tedavisi sağlar ve hatta C ++ 03 başlık korumalarını verir.