这是RECT和POINT阵列之间的reinterpret_cast安全吗?

时间:2011-01-31 08:34:48

标签: c++ windows winapi visual-c++ casting

Windows SDK包含一组typedef:

typedef long LONG;

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

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

然后,有一个WinAPI函数,它需要一个指向POINT结构数组的指针以及该数组的长度:

void ThatFunction( POINT* points, int numberOfElements );

我们有以下代码:

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

这样RECT被视为两个POINT结构的数组。

这样的演员安全吗?

3 个答案:

答案 0 :(得分:9)

因为Windows开发人员在WinDef.h中使用相同的打包声明了RECT和POINT,所以你几乎可以认为它是安全的。 Win32 API MapWindowPoints是一个可以传递RECT或一对POINT的函数示例。文档甚至建议使用它。

答案 1 :(得分:5)

对于这个特定的Win32结构,是的。你当然应该明确这个假设:

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

答案 2 :(得分:4)

我认为它会以您期望的方式运作,但这不是 safe 对我意味着什么。

如果你真的想玩得安全,最好的办法就是创建一个全新的POINT对象,然后用RECT的x和{{1}相应地设置yleft } fields。