6

データと関数、および一部のデータへのポインターを格納する必要がある符号なし整数の配列があります。私が使用しているデバイスでは、sizeof ポインターは sizeof unsigned int と同じです。関数へのポインタをunsigned intにキャストするにはどうすればよいですか? これによりコードが移植できなくなることはわかっていますが、マイクロコントローラー固有のものです。私はこれを試しました:

stackPtr[4] = reinterpret_cast<unsigned int>(task_ptr);

しかし、「無効な型変換」というエラーが表示されます

それを void ポインターにキャストしてから int にキャストするのは面倒です。

stackPtr[4] = reinterpret_cast<unsigned int>(static_cast<void *> (task_ptr));

それを行うためのきれいな方法はありますか?

編集 - task_ptr は関数ポインタですvoid task_ptr(void)

バーマーの答えが大好きで、移植性の欠点が取り除かれます。また、void ポインターの配列は、実際には Unsigned Ints よりも理にかなっています。Barmar と isaach1000 に感謝します。

編集 2: わかりました。私のコンパイラは大容量メモリ モデルを考えているので、予想していた 16 ビットではなく 32 ビット ポインタを使用しています (合計メモリが 17K の小さなマイクロ)。

4

3 に答える 3

4

C スタイルのキャストは、8 角形のペグを台形の穴にはめ込むことができるため、非常に具体的なターゲット ハードウェアと要件を考えると、そのキャストを使用し、わかりやすくするためにテンプレートにラップすることができます。

void*あるいは、 and thenへの二重キャストにintは、コードを目立つようにするという利点があるため、将来のメンテナーは何かが起こっていることを知り、特別な注意を払うことができます。

コメントの編集: コンパイラにバグがあるようです。次のコードは、g++ 4.5 でコンパイルされます。

#include <iostream>

int f()
{
    return 0;
}

int main()
{
    int value = (int)&f;

    std::cout << value << std::endl;
}

EDIT2: のintptr_t代わりに type の使用を検討することもできますint。ポインタを保持するのに十分な大きさの整数型です。

于 2013-05-06T15:12:39.620 に答える