2

GCCコンパイラでキャスト作業を再解釈する方法を知るにはどうすればよいですか? ドキュメントに記載されていますか?参照またはリンクが存在する場合、私はそれを知ることができますか?

4

2 に答える 2

1

標準のドキュメントを読むと、さまざまなタイプについて非常に明確です。しかし、基本的なポインターについては、次のとおりです。

ポインターは、それを保持するのに十分な大きさの任意の整数型に明示的に変換できます。マッピング関数は実装定義です。[注: 基礎となるマシンのアドレッシング構造を知っている人にとっては驚くべきことではありません。— 末尾の注] std::nullptr_t 型の値は整数型に変換できます。この変換は、(void*)0 から整数型への変換と同じ意味と有効性を持ちます。[注: reinterpret_cast を使用して、任意の型の値を型 std::nullptr_t に変換することはできません。— エンドノート]

整数の場合:

整数型または列挙型の値は、明示的にポインターに変換できます。十分なサイズの整数に変換され (実装に存在する場合)、同じポインター型に戻されるポインターは、元の値を持ちます。それ以外の場合、ポインターと整数の間のマッピングは実装定義です。[注: 3.7.4.3 で説明されている場合を除き、そのような変換の結果は、安全に導出されたポインター値にはなりません。—文末脚注]

于 2011-12-10T20:13:07.023 に答える
1

私はreinterpret_castg ++で何度も使用しました。struct組み込みプログラミングでは、周辺機器のレジスタを表す a をその (固定) アドレスにマッピングするのに役立ちます。

struct DEV_Registers
{
volatile uint32_t REGA;
volatile uint32_t REGB;
// ...
};

static DEV_Registers& DEV(*reinterpret_cast<DEV_Registers>(0x40000000));

これにより、次のようなコードを記述できます。

DEV.REGB = 0x12345678;

これは正しいことを行い (0x40000004 のレジスタを値 0x12345678 に設定)、非常に読みやすいです。

あなたの質問がこれ以上の詳細を求めているかどうかを判断するのは困難です.

于 2011-12-10T20:15:49.633 に答える