Касты в случае WinAPI
От: FrozenHeart  
Дата: 10.12.13 14:58
Оценка: :))
Приветствую.

Имеется WinAPI-функция (если быть более точным, то в данном случае это SendMessageTimeoutA), которая в качестве одного из параметров принимает аргумент типа PDWORD_PTR, который определён (по крайней мере, в моём случае — мало ли, это от каких-то макросов зависит) в заголовочном файле "basetsd.h" следующим образом:

typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;


ULONG_PTR определён как

typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;


Требуется вызвать данную функцию из кода, написанного на C++. Разумеется, все примеры в интернете пестрят вариантами с C-style кастами:

if (!SendMessageTimeoutA(
    window_handle
    , msg_id
    , NULL
    , NULL
    , SMTO_ABORTIFHUNG
    , 1000
    , (PDWORD)&lRes
    ))
{
    // ...
}


C-style касты, на мой взгляд, не должны быть в коде, написанном на C++, ведь специально для этих целей там были заведены операторы приведения типов. Впрочем, использовать reinterpret_cast тоже не очень-то и хочется, ведь существует прекрасный инструмент под названием boost::reinterpret_pointer_cast (boost в проекте итак используется, так что специально ради одного лишь каста подключать его не придётся). В таком случае каст примет вид

boost::reinterpret_pointer_cast<DWORD>(&lRes)


Обратите внимание, что в качестве шаблонного аргумента здесь используется уже не PDWORD, как это было в случае C-style каста, а DWORD. PDWORD определён как

typedef DWORD near          *PDWORD;


near, по идее, это "пустой" макрос:

#define near


К чему я веду? К тому, что от изначального PDWORD_PTR мы пришли аж к DWORD*, который, казалось бы, абсолютно то же самое, но гадать, будет ли при каких-то обстоятельствах он отличаться или нет — мне не очень хочется (мало ли, какие-то макросы на это влияют или ещё что-то).

Что Вы делаете в подобных случаях? Используете C-style каст и не паритесь? Делает reinterpret_cast? Используете boost::reinterpret_pointer_cast? В общем, подскажите, пожалуйста, best practices по этому поводу.
avalon/1.0.433
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.