¿Por qué el indicador /Wp64
en Visual C++ deprecated?¿Por qué está/Wp64 obsoleto?
CL: D9035 advertencia Línea de comandos:
opción 'Wp64' ha quedado obsoleto y se eliminará en una versión futura
¿Por qué el indicador /Wp64
en Visual C++ deprecated?¿Por qué está/Wp64 obsoleto?
CL: D9035 advertencia Línea de comandos:
opción 'Wp64' ha quedado obsoleto y se eliminará en una versión futura
Creo que /Wp64
es obsoleto debido principalmente a la compilación de un objetivo de 64 bits alcanzará los tipos de errores que fue diseñado para atrapar (/ Wp64 sólo es válido en las compilaciones de 32 bits) La opción se agregó cuando aparecieron los objetivos de 64 bits para ayudar a las personas a migrar sus programas a 64 bits y ayudar a detectar código que no era '64-bit clean '.
He aquí un ejemplo de los tipos de problemas con /Wp64
que Microsoft simplemente no está interesado en la fijación - probablemente con razón (de http://connect.microsoft.com/VisualStudio/feedback/details/502281/std-vector-incompatible-with-wp64-compiler-option):
En realidad, el TEL no es incompatible con intencionadamente
/Wp64
, ni es es total e incondicionalmente incompatible con/Wp64
. El problema subyacente de es que/Wp64
interactúa extremadamente mal con las plantillas , porque__w64
no está completamente integrado en el sistema de tipos. Por lo tanto, sivector<unsigned int>
se instancia antes devector<__w64 unsigned int>
, ambos se comportarán comovector<unsigned int>
, y viceversa. En x86,SOCKET
es un typedef para__w64 unsigned int
. No es obvio, perovector<unsigned int>
está siendo instanciado antes de suvector<SOCKET>
, ya quevector<bool>
está respaldado (en nuestra implementación ) porvector<unsigned int>
.Anteriormente (en VC9 y anteriores), esta mala interacción entre
/Wp64
y las plantillas causaban advertencias espurias. En VC10, sin embargo, los cambios a del STL empeoraron las cosas. Ahora, cuandovector::push_back()
se da un elemento del vector en sí, se da cuenta del índice del elemento antes de hacer otro trabajo. Ese índice se obtiene al restar la dirección del elemento del comienzo del vector.En su repro, esto implica restarconst SOCKET * - unsigned int *
. (Esto último esunsigned int *
y noSOCKET *
debido a la anteriormente descrita fallo.) Este/debería/desencadenar una advertencia falsa, diciendo "Estoy punteros que apuntan a restar del mismo tipo en x86, pero a tipos diferentes de x64 ". Sin embargo, hay un SEGUNDO error aquí, donde/Wp64
se confunde mucho y cree que es un error difícil (mientras que agrega constness alunsigned int *
).Estamos de acuerdo en que este mensaje de error falso es confuso. Sin embargo, desde está precedido por una advertencia de desactivación de línea de comando no silenciable D9035, creemos que eso debería ser suficiente. D9035 ya dice que no se debe usar
/Wp64
(aunque no continúa diciendo "esta opción es muy dudosa, y ahora es completamente innecesaria").En el STL, podríamos
#error
Cuando se utiliza/Wp64
. Sin embargo, eso rompería clientes que todavía están compilando con/Wp64
(a pesar de la advertencia de obsolescencia ) y no están desencadenando este error falso. El STL también podría emitir una advertencia, pero el compilador ya está emitiendo D9035.
Porque cuando se utiliza el compilador de 64 bits de VS2010 el compilador hace la detección de 64 bits de forma automática problemas ... este interruptor está de vuelta en el día en que se podría tratar de detectar un problema de 64 bits que se ejecuta el compilador de 32 bits ...
Ver http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=VS.100%29.aspx
Mal. Al menos * para VS2010. Los documentos están rotos. –
Podría vincular a la advertencia de desactivación, pero no podría ir a la documentación /Wp64
?
Por defecto, la opción de compilador/Wp64 está apagado en el compilador Visual C++ de 32 bits y en el compilador de Visual C++ de 64 bits.
Si compila regularmente la aplicación utilizando un compilador de 64 bits, puede desactivar/Wp64 en sus compilaciones de 32 bits porque el compilador de 64 bits detectará todos los problemas.
Énfasis añadido
¿Entonces lo están desaprobando simplemente porque no es 100% infalible? Me imagino que debe haber algo * mal * con eso, no simplemente el hecho de que no puede detectar todos los problemas (no es como un compilador de 64 bits puede detectar todos los problemas) ... – Mehrdad
@Mehrdad - son desaprobándolo porque el compilador de 64 bits hace el mismo trabajo de todos modos, de forma no opcional. –
Tal vez soy solo yo, pero no me parece convincente, lo siento. – Mehrdad
/Wp64 en compilaciones de 32 bits es una pérdida de tiempo. Está en desuso, y esta desaprobación tiene sentido. El camino/Wp64 funcionó en compilaciones de 32 bits es que buscaría una anotación _w64 en un tipo. Esta anotación _w64 le diría al compilador que, aunque este tipo es de 32 bits en el modo de 32 bits, es de 64 bits en el modo de 64 bits. Esto resultó ser realmente escaso, especialmente cuando se trata de plantillas.
/Wp64 en versiones de 64 bits es extremadamente útil. La documentación (http://msdn.microsoft.com/en-us/library/vstudio/yt4xw8fh.aspx) afirma que está activada por defecto en compilaciones de 64 bits, pero esto no es cierto. Las advertencias del compilador C4311 y C4312 solo se emiten si/Wp64 se establece explícitamente. Esas dos advertencias indican cuándo un valor de 32 bits se pone en un puntero, o viceversa. Estos son muy importantes para la corrección del código, y pretenden estar en el nivel de advertencia 1. He encontrado errores en el código muy extendido que se hubieran detenido si los desarrolladores hubieran activado/Wp64 para compilaciones de 64 bits. Desafortunadamente, también recibes la advertencia de línea de comando que has observado. No conozco ninguna manera de silenciar esta advertencia, y he aprendido a vivir con eso. En el lado positivo, si construye con advertencias como errores, esta advertencia de línea de comando no se convierte en un error.
Puede habilitar esas advertencias sin usar '/ Wp64', con algo como'/w44311/w44312'. La documentación es engañosa; lo que significa es que esas advertencias se habilitan por '/ Wp64', no que solo se pueden habilitar si' Wp64' está habilitado.Lamentablemente, no hay una lista de "advertencias que normalmente solo están habilitadas cuando'/Wp64' está habilitado "y no aparecen en la lista de" advertencias que no están activadas de manera predeterminada ", por lo que solo podemos buscar MSDN para encontrarlas. ellos :( –
@BenHymers - por lo que puedo decir, ** en VS2010 ** la * única * forma de obtener 'C4311' (incluso en la compilación x64) es especificar'/Wp64'. Creo que el consejo de user13251 es on. ('/ w44311' does * not * funciona para mí en mi VS2010, ni tampoco' pragma warning 'correspondiente) –
@MartinBa - ¡buena información, gracias! No recuerdo qué compilador estaba usando en 2014, pero Imagínese que funciona de la manera que describí en VS2012 o VS2013 ... :) ¡ojalá 2014 no solo estaba inventando cosas! –
¡Ahhh ahora * esto * es una respuesta convincente y razonable! ¡Muchas gracias por publicarlo! :) +1 – Mehrdad
Factually wrong: "compilar para un objetivo de 64 bits detectará los tipos de errores para los que fue diseñado (/ Wp64 solo es válido en compilaciones de 32 bits)" ... en VS2010/SP1 DEBE especificar '/ Wp64' también en x64 Compila si quieres obtener' C4311' (que * es * extremadamente útil). user13251 laso menciona esto en su respuesta. –