Цитировать из http://msdn.microsoft.com/en-us/library/windows/desktop/aa384242%28v=vs.85%29.aspx
Используйте UINT_PTR и INT_PTR, где это необходимо (и если вы не уверены
будь они необходимы, нет никакого вреда в использовании их только в
дело). Не приводите указатели к типам ULONG, LONG, INT, UINT,
или DWORD.
Могу ли я с уверенностью предположить, что преобразование всех ссылок на DWORD в UNIT_PTR в существующей 32-битной кодовой линии безопасно без каких-либо побочных эффектов?
Существуют ли другие рекомендуемые рекомендации по переносу 32-битного кода, который ссылается на DWORD через кодовую строку?
Это слишком грубо. Просто позвольте компилятору сделать всю работу за вас, включите предупреждение 4302, чтобы оно сообщало вам, когда значение указателя будет усечено. Поместите #pragma в хорошее место, идеально скомпилированный заголовочный файл. Или укажите /we4302
опция компилятора.
#pragma warning(default:4302)
int main()
{
int* p = 0;
long bad = (long)p; // C4302: 'type cast' : truncation from int* to long
return 0;
}
Параметр компиляции / Wp64 также может быть полезен, но в любом случае есть проблемы.
Вам нужно только использовать INT_PTR
или же UINT_PTR
если вы планируете хранить указатель на переменную (включая различные формы HANDLE
). Если это просто обычное целое значение, то это не имеет значения.
Я ожидаю, что вы получите по крайней мере несколько предупреждений за «попытку сохранить больший тип в меньшем типе», если вы вслепую перевели все DWORD
в UINT_PTR
, [То есть, когда вы компилируете код для 64-битного, как в 32-битном коде, тип UINT_PTR
такой же как DWORD
поэтому вы можете не получать никаких предупреждений в этом случае].
Чтобы добавить ответ @MatsPetersson —
Причина DWORD
для хранения адресов широко используется то, что он соответствует размеру указателя на 32-битной архитектуре.
Рекомендуется использовать специальные типы для переменных, содержащих адреса. Это то что UINT_PTR
& INT_PTR
предназначены для — они верны как для 32-, так и для 64-битных целей, поскольку их определение установлено правильно в соответствии с целью компиляции. На самом деле, вы можете просмотреть заголовки MS и увидеть сами фактические типы примитивов, которым соответствуют эти типы.
Всякий раз, когда переменная используется для данных, отличных от адреса, фактический тип должен быть определен в соответствии с сохраненными данными и обычно не будет зависеть от базовой архитектуры компьютера — DWORD
останется DWORD
, WORD
останется WORD
и т.п.