Mehrere Antworten haben auf uintptr_t
und hingewiesen#include <stdint.h>
als "die" Lösung . Das ist, wie ich vorschlage, ein Teil der Antwort, aber nicht die ganze Antwort. Sie müssen auch überprüfen, wo die Funktion mit der Nachrichten-ID von FOO aufgerufen wird.
Betrachten Sie diesen Code und die Zusammenstellung:
$ 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
$
Sie werden feststellen, dass am aufrufenden Ort (in main()
) ein Problem vorliegt - das Konvertieren einer Ganzzahl in einen Zeiger ohne Umwandlung. Sie müssen Ihre function()
in all ihren Verwendungen analysieren, um zu sehen, wie Werte an sie übergeben werden. Der Code in meinem function()
würde funktionieren, wenn die Aufrufe geschrieben würden:
unsigned long i = 0x2341;
function(1, &i);
Da Ihre wahrscheinlich anders geschrieben sind, müssen Sie die Punkte überprüfen, an denen die Funktion aufgerufen wird, um sicherzustellen, dass es sinnvoll ist, den angegebenen Wert zu verwenden. Vergessen Sie nicht, dass Sie möglicherweise einen latenten Fehler finden.
Wenn Sie den Wert des void *
Parameters (wie konvertiert) formatieren möchten, schauen Sie sich den <inttypes.h>
Header genau an (anstelle von stdint.h
- inttypes.h
bietet die Dienste von stdint.h
, was ungewöhnlich ist, aber der C99-Standard besagt, dass der Header <inttypes.h>
den Header <stdint.h>
und enthält erweitert es um zusätzliche Funktionen, die von gehosteten Implementierungen bereitgestellt werden ) und verwendet die PRIxxx-Makros in Ihren Formatzeichenfolgen.
Außerdem gelten meine Kommentare ausschließlich für C und nicht für C ++, aber Ihr Code befindet sich in der Teilmenge von C ++, die zwischen C und C ++ portierbar ist. Die Chancen stehen gut bis gut, dass meine Kommentare zutreffen.
size_t
nicht funktioniert, ist der segmentierte i386-Speicher. Obwohl eine 32-Bit-Maschine,sizeof
kehrt2
für zurücksize_t
. Die Antwort von Alex unten scheint korrekt zu sein. Alex 'Antwort unduintptr_t
funktioniert fast überall und ist jetzt Standard. Es bietet eine C ++ 11-Behandlung und sogar die C ++ 03-Header-Schutzvorrichtungen.