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
结构的数组。
这样的演员安全吗?
答案 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}相应地设置y
和left
} fields。