0

関数をテストする関数を書きました。私は柔軟になりたい、それが関数ポインタの理由です。

私のコードは機能していますが、以下の警告を回避する可能性はありますか? キャストを考えました。

(UINT32 *)そのため、 の前にa を設定しようとしました&tickGetが、機能しません。

手伝って頂けますか?

ULONG tickGet (void);

void WCET_Measurement(UINT32 (*Function)(void)){}

WCET_Measurement(&tickGet);

コンパイラの警告

warning: passing arg 1 of `WCET_Measurement' from incompatible pointer type
4

2 に答える 2

3

関数ポインターのキャストは明確に定義されています。ただし、互換性のないポインターを介して関数を呼び出すことは未定義の動作です。したがって、UINT32が a とは異なる型である場合ULONG、問題が発生します。

しかし、本当にキャストしたい場合は、これを行うことができます:

WCET_Measurement((UINT32 (*)(void))&tickGet);

または、さらに良いことに、次を使用しtypedefます。

typedef UINT32 (*MyFunc)(void);

WCET_Measurement((MyFunc)&tickGet);
于 2013-01-16T14:21:41.217 に答える
1

あなたのキャストの試みは間違っていました。

必要なもの:

WCET_Measurement(((UINT32)(*)(void)) tickGet);

typedef関数ポインタを明確にするために、関数ポインタとともにa を使用するとよい場合がよくあります。

もちろん、システム上でUINT32との 2 つのタイプULONGが異なる場合、これはひどく壊れます。

于 2013-01-16T14:22:18.563 に答える