2011-08-24 6 views

risposta

15

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 di vector<__w64 unsigned int>, entrambi si comportano come vector<unsigned int> e viceversa. Su x86, SOCKET è un typedef per __w64 unsigned int. Non è ovvio, ma viene istanziato prima del tuo vector<SOCKET>, dal momento che vector<bool> è supportato (nella nostra implementazione ) da vector<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, quando vector::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 di const SOCKET * - unsigned int *. (Quest'ultimo è unsigned int * e non SOCKET * 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 allo unsigned 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.

+0

Ahhh ora * questa * è una risposta convincente e ragionevole !! Grazie mille per averlo pubblicato! :) +1 – Mehrdad

+0

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. –

2

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

+0

Errore. Al * minimo * per VS2010. I documenti sono rotti. –

0

È 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 è

+0

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

+0

@Mehrdad - sono deprecandolo perché il compilatore a 64 bit esegue lo stesso lavoro comunque, su base non facoltativa. –

+0

Forse sono solo io, ma non lo trovo convincente, mi dispiace. – Mehrdad

4

/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.

+0

È 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 :( –

+0

@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 ') –

+0

@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! –