Perché il flag /Wp64
in Visual C++ deprecated?Perché/Wp64 è deprecato?
cl: D9035 linea di avvertimento di comando:
opzione 'Wp64' è stato deprecato e verrà rimosso in una versione futura
Perché il flag /Wp64
in Visual C++ deprecated?Perché/Wp64 è deprecato?
cl: D9035 linea di avvertimento di comando:
opzione 'Wp64' è stato deprecato e verrà rimosso in una versione futura
penso che /Wp64
è deprecato soprattutto perché la compilazione di un target a 64 bit prenderà i tipi di errori è stato progettato per catturare (/ Wp64 è valida solo in compilazioni a 32 bit). L'opzione è stata riaggiunta quando sono emersi obiettivi a 64 bit per aiutare le persone a migrare i loro programmi a 64 bit e aiutare a rilevare il codice che non era "64 bit pulito".
Ecco un esempio dei tipi di problemi con /Wp64
che Microsoft semplicemente non è interessato a fissaggio - probabilmente a ragione (da http://connect.microsoft.com/VisualStudio/feedback/details/502281/std-vector-incompatible-with-wp64-compiler-option):
In realtà, lo STL non è intenzionalmente incompatibile con
/Wp64
, né è completamente e incondizionatamente incompatibile con/Wp64
. Il problema sottostante è che l'interfaccia/Wp64
interagisce estremamente male con i modelli , perché__w64
non è completamente integrato nel sistema di tipi. Pertanto, se viene istanziato prima divector<__w64 unsigned int>
, entrambi si comportano comevector<unsigned int>
e viceversa. Su x86,SOCKET
è un typedef per__w64 unsigned int
. Non è ovvio, ma viene istanziato prima del tuovector<SOCKET>
, dal momento chevector<bool>
è supportato (nella nostra implementazione ) davector<unsigned int>
.Precedentemente (in VC9 e precedenti), questa cattiva interazione tra
/Wp64
e i modelli provocavano avvisi spuri. In VC10, tuttavia, le modifiche a STL hanno peggiorato la situazione. Ora, quandovector::push_back()
viene assegnato a un elemento del vettore stesso, viene rilevato l'indice dell'indice prima di eseguire altri lavori. Questo indice si ottiene sottraendo l'indirizzo dell'elemento dall'inizio del vettore.Nella tua replica, ciò comporta la sottrazione diconst SOCKET * - unsigned int *
. (Quest'ultimo èunsigned int *
e nonSOCKET *
a causa del bug descritto in precedenza .) Questo/dovrebbe/innescare un allarme spurio, dicendo: "Sono puntatori sottraendo che puntano allo stesso tipo su x86, ma per tipi differenti su x64" . Tuttavia, vi è un SECONDO bug qui, dove/Wp64
diventa davvero confuso e pensa che questo sia un errore grave (mentre aggiunge constity allounsigned int *
).Siamo d'accordo che questo messaggio di errore falso è confuso. Tuttavia, dal momento che è preceduto da un avviso di deprecazione della riga di comando non silenziabile D9035, riteniamo che ciò dovrebbe essere sufficiente. D9035 dice giàche
/Wp64
non deve essere usato (anche se non continua a dire "questa opzione è super buggy e completamente inutile ora").In STL, è possibile
#error
quando viene utilizzato/Wp64
. Tuttavia, ciò equivarrà allo di interrompere i clienti che stanno ancora compilando con/Wp64
(nonostante l'avviso di deprecazione ) e non attivano questo errore fittizio. Anche l'STL potrebbe emettere un avviso, ma il compilatore sta già emettendo D9035.
Perché quando si utilizza il compilatore a 64 bit dal VS2010 compilatore fa il rilevamento di 64 bit problemi automaticamente ... questo interruttore si trova dalla parte posteriore nel giorno in cui si potrebbe provare a rilevare problema 64 bit esegue il compilatore a 32 bit ...
Vedi http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=VS.100%29.aspx
Errore. Al * minimo * per VS2010. I documenti sono rotti. –
È possibile eseguire il collegamento all'avviso di ritiro, ma non è possibile accedere alla documentazione /Wp64
?
Per impostazione predefinita, l'opzione del compilatore/Wp64 è disattivata nel compilatore a 32 bit di Visual C++ e nel compilatore di Visual C++ a 64 bit.
Se si compila regolarmente l'applicazione utilizzando un compilatore a 64 bit, è possibile disabilitare/Wp64 nelle compilazioni a 32 bit perché il compilatore a 64 bit rileverà tutti i problemi.
Il corsivo è
Quindi lo stanno deprecando solo perché non è sicuro al 100%? Ho immaginato che ci fosse effettivamente qualcosa * sbagliato * con esso, non semplicemente il fatto che non è in grado di rilevare tutti i problemi (non è come un compilatore a 64 bit in grado di rilevare tutti i problemi) ... – Mehrdad
@Mehrdad - sono deprecandolo perché il compilatore a 64 bit esegue lo stesso lavoro comunque, su base non facoltativa. –
Forse sono solo io, ma non lo trovo convincente, mi dispiace. – Mehrdad
/Wp64 su build a 32 bit è una perdita di tempo. È deprecato e questa deprecazione ha senso. Il modo in cui Wp64 ha funzionato su build a 32 bit è che cercherebbe un'annotazione _w64 su un tipo. Questa annotazione _w64 direbbe al compilatore che, anche se questo tipo è a 32 bit in modalità a 32 bit, è 64 bit in modalità 64 bit. Questo si è rivelato davvero perfetto, specialmente quando sono coinvolti i modelli.
/Wp64 su 64-bit build è estremamente utile. La documentazione (http://msdn.microsoft.com/en-us/library/vstudio/yt4xw8fh.aspx) afferma che è attivata per impostazione predefinita nei build a 64 bit, ma questo non è vero. Gli avvisi del compilatore C4311 e C4312 vengono emessi solo se/Wp64 è impostato in modo esplicito. Questi due avvisi indicano quando un valore a 32 bit viene inserito in un puntatore o viceversa. Questi sono molto importanti per la correttezza del codice e dichiarano di essere al livello di avviso 1. Ho trovato bug in codice molto diffuso che sarebbero stati interrotti se gli sviluppatori avessero acceso/Wp64 per i build a 64-bit. Sfortunatamente, ricevi anche l'avviso della riga di comando che hai osservato. Non conosco alcun modo per soffocare questo avvertimento e ho imparato a conviverci. Sul lato positivo, se si compilano come avvisi come errori, questo avviso della riga di comando non si trasforma in un errore.
È possibile abilitare questi avvisi senza usare '/ Wp64', con qualcosa come'/w44311/w44312'. La documentazione è fuorviante; ciò che significa è che quegli avvertimenti vengono abilitati da '/ Wp64', non che possono essere abilitati solo se' Wp64' è abilitato.Purtroppo non esiste un elenco di "avvertenze che sono normalmente abilitate solo quando'/Wp64' è abilitato "e non appaiono nell'elenco di" avvisi che non sono attivi per impostazione predefinita ", quindi siamo lasciati a scegliere tramite MSDN per trovare loro :( –
@BenHymers - per quanto posso dire, ** su VS2010 ** il * solo * modo di ottenere 'C4311' (anche su build x64) è specificare'/Wp64'. Penso che il consiglio di user13251 sia chiaro ('/ w44311' fa * not * funziona per me sul mio VS2010, né il corrispondente' pragma warning ') –
@MartinBa - buone informazioni, grazie! Non riesco a ricordare quale compilatore stavo usando nel 2014 ma io Immagino che funzioni come ho descritto in VS2012 o VS2013 ... :) spero che il 2014 non stia solo inventando qualcosa! –
Ahhh ora * questa * è una risposta convincente e ragionevole !! Grazie mille per averlo pubblicato! :) +1 – Mehrdad
Factually wrong: "la compilazione per un target a 64 bit catturerà i tipi di errori che è stato progettato per catturare (/ Wp64 è valido solo per le compilazioni a 32 bit)" ... su VS2010/SP1 DEVI specificare '/ Wp64' anche in x64 Build se vuoi ottenere' C4311' (che * è * estremamente utile). user13251 laso lo menziona nella sua risposta. –