13

検索しましたが、結果が見つかりませんでした (用語が間違っている可能性があります)。

void*最初に関数ポインターを宣言してから関数ポインターにアドレスを割り当てることなく、C で a を関数として呼び出す簡単な方法があるかどうか疑問に思っていました。

すなわち。呼び出される関数が型であると仮定しますvoid(void)

void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */

上記のコードでエラー C2066: cast to function type is illegal in VC2008が発生します

これが可能な場合、戻り値の型と複数のパラメーターを持つ関数の構文はどのように異なりますか?

4

3 に答える 3

31

キャストは次のとおりです。

((void (*)(void)) ptr)();

typedef一般に、これは関数ポインタ型の を作成することで簡単にできます。

typedef void (*func_type)(void);
((func_type) ptr)();

ただし、通常のポインター (オブジェクトへのポインター) を関数ポインターにキャストしたり、関数ポインターからキャストしたりすることは、標準 C では厳密には合法ではありません (一般的な拡張ではありますが)。

于 2010-04-14T07:55:15.590 に答える
13

関数型にキャストするとき、私はひどく混乱します。関数ポインター型を typedef する方が簡単で読みやすいです。

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();
于 2010-04-14T07:54:04.357 に答える
12

C++ の場合:reinterpret_cast< void(*)() > (ptr) ()

を使用するとreinterpret_cast、紛らわしい括弧のセットを節約でき、< >は呼び出し自体から型を明確に設定します。

于 2010-04-14T08:39:08.230 に答える