Уточнение: портирование с 32 на 64 бит

Цитировать из 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 через кодовую строку?

3

Решение

Это слишком грубо. Просто позвольте компилятору сделать всю работу за вас, включите предупреждение 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 также может быть полезен, но в любом случае есть проблемы.

6

Другие решения

Вам нужно только использовать INT_PTR или же UINT_PTR если вы планируете хранить указатель на переменную (включая различные формы HANDLE). Если это просто обычное целое значение, то это не имеет значения.

Я ожидаю, что вы получите по крайней мере несколько предупреждений за «попытку сохранить больший тип в меньшем типе», если вы вслепую перевели все DWORD в UINT_PTR, [То есть, когда вы компилируете код для 64-битного, как в 32-битном коде, тип UINT_PTR такой же как DWORD поэтому вы можете не получать никаких предупреждений в этом случае].

2

Чтобы добавить ответ @MatsPetersson —

Причина DWORD для хранения адресов широко используется то, что он соответствует размеру указателя на 32-битной архитектуре.

Рекомендуется использовать специальные типы для переменных, содержащих адреса. Это то что UINT_PTR & INT_PTR предназначены для — они верны как для 32-, так и для 64-битных целей, поскольку их определение установлено правильно в соответствии с целью компиляции. На самом деле, вы можете просмотреть заголовки MS и увидеть сами фактические типы примитивов, которым соответствуют эти типы.

Всякий раз, когда переменная используется для данных, отличных от адреса, фактический тип должен быть определен в соответствии с сохраненными данными и обычно не будет зависеть от базовой архитектуры компьютера — DWORD останется DWORD, WORD останется WORD и т.п.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector