Почему / Wp64 не рекомендуется? - PullRequest
15 голосов
/ 24 августа 2011

Почему флаг /Wp64 в Visual C ++ устарел ?

cl: Предупреждение командной строки D9035:
опция 'Wp64' устарела и будет устаревшейудалено в будущем выпуске

Ответы [ 4 ]

17 голосов
/ 24 августа 2011

Я думаю, что /Wp64 устарело, главным образом потому, что компиляция для 64-битной цели будет отлавливать виды ошибок, для которых она предназначена (/ Wp64 допустима только в 32-битных компиляциях).Опция была добавлена, когда появлялись 64-битные цели, чтобы помочь людям перевести свои программы на 64-битные и обнаружить код, который не был «64-битным чистым».

Вот пример тех проблем с /Wp64, которые Microsoft просто не заинтересована в исправлении - вероятно, правильно (из http://connect.microsoft.com/VisualStudio/feedback/details/502281/std-vector-incompatible-with-wp64-compiler-option):

На самом деле STL нене является преднамеренно несовместимым с /Wp64 и не является полностью и безусловно несовместимым с /Wp64. Основная проблема заключается в том, что /Wp64 крайне плохо взаимодействует с шаблонами, поскольку __w64 не полностью интегрирован в систему типов. Поэтому, если vector<unsigned int> создается перед vector<__w64 unsigned int>, то оба они будут вести себя как vector<unsigned int>, и наоборот. На x86 SOCKET является typedef для __w64 unsigned int. Это не очевидно, но vector<unsigned int> являетсябудучи созданным перед вашим vector<SOCKET>, поскольку vector<bool> поддерживается (в нашей реализации) vector<unsigned int>.

Ранее (в VC9 и более ранних версиях) это плохое взаимодействие между /Wp64 и шаблонами вызывало ложные предупрежденияОднако в VC10 изменения в STL усугубили ситуацию. Теперь, когда элементу вектора задан vector::push_back(), он вычисляет индекс элемента передделать другую работу.Этот индекс получается путем вычитания адреса элемента из начала вектора.В вашем репро это включает в себя вычитание const SOCKET * - unsigned int *.(Последнее значение равно unsigned int *, а не SOCKET * из-за ранее описанной ошибки.) Это / следует / вызвать ложное предупреждение, говорящее: «Я вычитаю указатели, которые указывают на один и тот же тип на x86, но на разные типы наx64" .Однако здесь есть ВТОРАЯ ошибка, когда /Wp64 действительно запутывается и думает, что это серьезная ошибка (при добавлении константности к unsigned int *).

Мы согласны с тем, что это поддельное сообщение об ошибке сбивает с толку.Однако, так как ему предшествует предупреждение об устаревании командной строки D9035, не требующее молчания, мы считаем, что этого должно быть достаточно.D9035 уже говорит, что /Wp64 не следует использовать (хотя он и не говорит, что «эта опция супер глючная и теперь совершенно не нужна»).

В STL мы могли бы #error при использовании /Wp64.Однако это сломало бы клиентов, которые все еще компилируют с /Wp64 (несмотря на предупреждение об устаревании) и не вызывают эту фиктивную ошибку.STL также может выдавать предупреждение, но компилятор уже выдает D9035.

4 голосов
/ 11 февраля 2013

/ Wp64 на 32-битных сборках - пустая трата времени.Это устарело, и это осуждение имеет смысл.Работа / Wp64 в 32-битных сборках заключается в поиске аннотации _w64 для типа.Эта аннотация _w64 сообщит компилятору, что, хотя этот тип 32-битный в 32-битном режиме, он 64-битный в 64-битном режиме.Это оказалось очень странным, особенно когда речь идет о шаблонах.

/ Wp64 на 64-битных сборках чрезвычайно полезен.В документации (http://msdn.microsoft.com/en-us/library/vstudio/yt4xw8fh.aspx) утверждается, что она включена по умолчанию в 64-разрядных сборках, но это не так. Предупреждения компилятора C4311 и C4312 выдаются только в том случае, если явно задан параметр / Wp64. Эти два предупреждения указывают, когда 32-битное значение помещается в указатель или наоборот. Они очень важны для правильности кода и утверждают, что находятся на уровне предупреждения 1. Я обнаружил ошибки в очень распространенном коде, которые были бы остановлены, если бы разработчики включили/ Wp64 для 64-битных сборок. К сожалению, вы также получаете предупреждение о командной строке, которое вы заметили. Я не знаю, как можно подавить это предупреждение, и я научился жить с ним. С другой стороны, если вы строите скак предупреждения как ошибки, это предупреждение командной строки не превращается в ошибку.

2 голосов
/ 24 августа 2011

Поскольку при использовании 64-битного компилятора из VS2010 компилятор автоматически обнаруживает 64-битные проблемы ... этот переключатель относится ко времени, когда вы могли попытаться обнаружить 64-битную проблему при работе 32-битного компилятора ...

См. http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=VS.100%29.aspx

0 голосов
/ 24 августа 2011

Вы можете сослаться на предупреждение об устаревании, но не можете перейти к документации /Wp64?

По умолчанию параметр компилятора / Wp64 отключен в 32-разрядном компиляторе Visual C ++ и включен в 64-разрядном компиляторе Visual C ++.

Если вы регулярно компилируете свое приложение с помощью 64-битного компилятора, вы можете просто отключить / Wp64 в своих 32-битных компиляциях , потому что 64-битный компилятор обнаружит все проблемы.

Акцент добавлен

...