2011-01-31 3 views
4

のWindows SDKは、型定義のセットが含まれています。そして、POINT構造体の配列とその配列の長さへのポインタを期待するWinAPIの機能がありますこれはRECTとPOINTの間のreinterpret_castセーフですか?

typedef long LONG; 

typedef struct tagPOINT 
{ 
    LONG x; 
    LONG y; 
} POINT; 

typedef struct tagRECT 
{ 
    LONG left; 
    LONG top; 
    LONG right; 
    LONG bottom; 
} RECT; 

void ThatFunction(POINT* points, int numberOfElements); 

と我々が持っています以下のコード:

RECT rect = ...//obtained from somewhere 
ThatFunction(reinterpret_cast<POINT*>(&rect), 2); 

RECTは2のアレイとして扱われているように構造体。

キャストは安全ですか?

答えて

5

この特定のWin32構造体については、はい。もちろん、この仮定を明示的にする必要があります:

static_assert(sizeof(struct tagRECT) == 2 * sizeof(POINT)); 
static_assert(offsetof(struct tagRECT, right) == sizeof(POINT)); 
+1

C++のstatic_assert()での良い例として+1。 –

9

Windowsデベロッパーが同じパッケージでWinDef.h内のRECTとPOINTをそれぞれ隣に宣言しているので、かなり安全だと思われます。 Win32 API、MapWindowPointsは、RECTまたはPOINTのペアを渡すことができる関数の例です。ドキュメントはそのように使用することを提案する。

+3

+1パッキングも明示的に定義されています。これは 'reinterpret_cast'を安全にするこの(移植できない)トリックです。 – MSalters

4

私はそれがあなたの期待通りに働くと思うが、それは何ではない安全は、私に。

あなたが本当に安全なプレイしたい場合は、行うための最善のことは、全く新しいPointオブジェクトを作成し、RECTのlefttopフィールドに応じてxyを設定することです。

関連する問題