2011-01-31 14 views
4

Windows SDK中包含了一組類型定義的: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; 

然後,有一個期望一個指向POINT結構數組,該數組的長度WinAPI的函數:

void ThatFunction(POINT* points, int numberOfElements); 

,我們有以下代碼:

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

使得RECT被視爲兩個陣列結構。

就是這樣鑄造安全嗎?

回答

5

對於這個特殊的Win32結構,是的。當然,你應該明確這個假設:

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

+1對於C++ 0x static_assert()的使用很好的例子。 – 2011-01-31 13:37:08

9

由於Windows開發人員宣佈RECT並指向緊挨着在WINDEF.H用相同的包裝,你幾乎可以認爲它是安全的。在Win32 API,MapWindowPoints,是可以被傳遞一個RECT或一對點的函數的一個例子。文檔甚至建議使用它。

+3

+1包裝也是明確定義的,它是這個(非便攜式)技巧,它使`reinterpret_cast`安全。 – MSalters 2011-01-31 13:05:59

4

我認爲它會以你期望的方式工作,但這不是對我來說意味着安全的安全安全

如果你真的想爲了穩妥起見,做的最好的事情就是創造一個全新的點對象,並與RECT的lefttop領域設置xy相應。

相關問題