2011-01-31 63 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相应。

相关问题