いくつかの答えが指摘し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
。以下のアレックスの答えは正しいようです。アレックスの答えは、uintptr_t
ほぼすべての場所で機能し、現在は標準となっています。これはC ++ 11処理を提供し、C ++ 03ヘッダーガードも提供します。