Безопасен ли этот reinterpret_cast между массивами RECT и POINT? - PullRequest
4 голосов
/ 31 января 2011

Windows SDK содержит набор typedefs:

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 ]

9 голосов
/ 31 января 2011

Поскольку разработчики Windows объявили RECT и POINT рядом с каждым в WinDef.h с одинаковой упаковкой, вы можете предположить, что это безопасно.Win32 API, MapWindowPoints , является примером функции, которой можно передать RECT или пару точек.Документы даже предлагают использовать его как таковой.

5 голосов
/ 31 января 2011

Для этой конкретной структуры Win32, да. Конечно, вы должны сделать это предположение явным:

static_assert(sizeof(struct tagRECT) == 2 * sizeof(POINT));
static_assert(offsetof(struct tagRECT, right) == sizeof(POINT));
4 голосов
/ 31 января 2011

Я думаю, что это будет работать так, как вы ожидаете, но это не то, что safe означает для меня.

Если вы действительно хотите играть безопасно, лучше всего создать новый объект POINT и установить x и y соответственно с полями RECT left и top.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...