4

C99 標準にはuintptr_t、データ ポインター (オブジェクトへのポインター) を変換するための推奨される整数型がありますが、関数ポインターを格納するための同等の整数型は見つかりませんでした。私はそれを見落としましたか?

特定のコンパイラは、標準にない場合でもそのような型を定義できますが、コンパイラはuint64_t、新しい型を定義するよりも、(たとえば) a に関数ポインタを格納できると述べる可能性が高くなります。

もう 1 つの違いは、関数ポインターでは行われない方法で、データ ポインターで整数演算を行うことが理にかなっていることです。1 つの一般的なイディオムは次のとおりです(int*)(((uintptr_t)p + 15) & ~(uintptr_t)15)が、このイディオムを関数ポインターに適用する理由はありません。

4

3 に答える 3

3

変換する関数ポインターのような整数型はありません。

理由の 1 つは、一部のマシンでは、関数アドレスが非常に大きくなり、データ ポインターよりも大きくなる可能性があることです。

于 2013-08-24T11:54:35.000 に答える
3

いいえ、そのような推奨されるポインター型はありません。

ポインターを格納するには、関数を呼び出さない限り、他の関数ポインター型を使用できます。

元の型に戻すよりもポインターを変換する場合は、関数を呼び出すことができます。これは常に動作することが保証されています。

于 2013-08-24T11:45:58.163 に答える
3

関数ポインターを格納するための同等の整数型が見つかりませんでした

これは、関数ポインタを整数に変換できないためです。これを行うと、未定義の動作が発生します。

于 2013-08-24T11:47:26.250 に答える