여러 답변에서 지적 uintptr_t
하고#include <stdint.h>
'는'솔루션으로. 즉, 답변의 일부이지만 전체 답변은 아닙니다. 또한 FOO의 메시지 ID로 함수가 호출되는 위치를 확인해야합니다.
이 코드와 컴파일을 고려하십시오.
$ 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
$
호출 위치 (in main()
)에 문제가 있음을 알 수 있습니다. 캐스트없이 정수를 포인터로 변환합니다. function()
값이 전달되는 방식을 확인하려면 모든 용도를 분석해야 합니다. function()
호출이 작성되면 내 코드 가 작동합니다.
unsigned long i = 0x2341;
function(1, &i);
당신의 것들은 아마도 다르게 쓰여질 것이므로, 표시된대로 값을 사용하는 것이 합리적인지 확인하기 위해 함수가 호출되는 지점을 검토해야합니다. 잊지 마세요. 잠재적 인 버그를 발견 할 수 있습니다.
또한이 값의 형식을하려는 경우, void *
매개 변수 (변환 등)에주의 깊게 살펴 <inttypes.h>
헤더 (대신 stdint.h
- inttypes.h
의 서비스를 제공하는 stdint.h
특별한이다,하지만 C99 표준은 말한다 그는 헤더는 [t] <inttypes.h>
헤더를 포함 <stdint.h>
하고 호스팅 된 구현에서 제공하는 추가 기능으로 확장하고 형식 문자열에 PRIxxx 매크로를 사용합니다.
또한 내 의견은 C ++가 아닌 C에 엄격하게 적용되지만 코드는 C와 C ++간에 이식 가능한 C ++의 하위 집합에 있습니다. 내 의견이 적용될 가능성은 공평합니다.
size_t
작동하지 않는 구체적인 예 는 i386 세그먼트 메모리입니다. 32 비트 컴퓨터했지만,sizeof
반환2
을 위해size_t
. 아래 Alex 대답 이 올바른 것 같습니다 . Alex의 대답과uintptr_t
작업은 거의 모든 곳에서 현재 표준입니다. C ++ 11 처리를 제공하고 C ++ 03 헤더 가드도 제공합니다.