2013-02-26 2 views
3

Цитируя http://msdn.microsoft.com/en-us/library/windows/desktop/aa384242%28v=vs.85%29.aspxРазъяснение: Портирование 32 до 64 бит

Использование UINT_PTR и INT_PTR в случае необходимости (и если вы не уверены требуются ли они, нет никакого вреда в использовании их только в случае). Не указывайте свои указатели на типы ULONG, LONG, INT, UINT, или DWORD.

Можно ли с уверенностью предположить, что преобразование всех ссылок DWORD в UNIT_PTR в существующую 32-разрядную Codeline безопасно без каких-либо побочных эффектов?

Есть ли другие рекомендуемые рекомендации по переносу 32-битного кода, который ссылается на DWORD через кодовую линию?

+0

wait, no, вы неправильно поняли. НЕ СОДЕРЖАЙТЕ ВСЕ 'DWORD'' UINT_PTR'! –

+0

@MooingDuck: И почему вы так думаете? Не могли бы вы объяснить? – Abhijit

+4

(1) 'UINT_PTR' должен использоваться _if и только если вам нужно сохранить указатель в переменной целочисленного типа. В противном случае используйте целое число или указатель. (2) 'UINT_PTR' иногда будет 32-битным, иногда 64-битным, большую часть времени, вам просто не нужно. (3) Поскольку он нарушает совместимость и переносимость двоичных файлов, в зависимости от того, как вы сделали свой ввод-вывод, он может сделать ваши данные не переносимыми. –

ответ

6

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

+0

+1: «Это слишком грубо», но это самое практичное решение для меня – Abhijit

+0

Ваш ответ был наиболее практичным. Я добавил/we4302 в мою систему сборки и теперь изо всех сил пытаюсь исправить устаревшие грехи – Abhijit

2

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

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

+0

Могу ли я с уверенностью заключить, что могу конвертировать все ссылки DWORD в UINIT_PTR? – Abhijit

+0

Я подумал, что это то, на что я ответил: вы не должны просто вслепую конвертировать КАЖДЫЙ 'DWORD' в' UINT_PTR', потому что, вероятно, есть случаи, когда 'DWORD' - это именно то, что нужно. Конечно, не видя кода, я не знаю, так как я не знаю, для чего вы используете 'DWORD'. Однако почти во всех случаях DWORD не используется для хранения указателя, поэтому, если ничего больше, вы будете использовать больше места для своих данных, чем это необходимо. –

+0

'так что если ничего больше, вы будете использовать больше места для своих данных, чем необходимо', да, я понимаю. Но, как вы сказали, DWORD используется для многого другого, кроме как хранить указатель, если я слепо конвертирую все DWORD в UNIT_PTR, кроме использования большего пространства, будет ли другая импликация? – Abhijit

1

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

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

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

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

+1

Это, безусловно, больше не используется. Это дерьмо - ошибка. – Puppy

+0

@DeadMG Что конкретно не широко используется? И что такое дерьмо и что такое ошибка? – SomeWittyUsername

Смежные вопросы