いくつかの回答は、「その」ソリューションとして指摘さ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
$
呼び出し位置 ( ) に問題があることがわかりますmain()
— キャストなしで整数をポインターに変換します。function()
値がどのように渡されるかを確認するには、すべての使用法を分析する必要があります。function()
呼び出しが記述されている場合、my 内のコードは機能します。
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++ のサブセットです。私のコメントが当てはまる可能性はかなり高いです。