Ultime modifiche al compilatore Visual C++ 2005
Aggiornamento: novembre 2007
In questo argomento vengono illustrate le modifiche al comportamento in Visual C++ 2005 che possono impedire la compilazione del codice funzionante in una versione precedente o causarne un comportamento diverso in fase di esecuzione.
Per ulteriori informazioni sulle nuove funzioni, vedereModifiche apportate in Visual C++ 2005 e versioni precedenti, Modifiche alle librerie di Visual C++ 2005, e Modifiche apportate al compilatore, al linguaggio e agli strumenti Visual C++ 2005.
Il puntatore a membri ora richiede un nome completo e &
Il codice scritto per le versioni precedenti del compilatore nelle quali veniva utilizzato solo il nome del metodo genererà Errore del compilatore C3867 o Avviso del compilatore C4867. Questo messaggio diagnostico è richiesto dallo Standard C++. Adesso per creare un puntatore in una funzione membro, è necessario utilizzare l'indirizzo dell'operatore (&) con il nome completo del metodo. Se non si deve utilizzare l'operatore & e il nome completo del metodo questo può provocare bug logici in codice dovuti alle parentesi mancanti nelle chiamate di funzione. Se si utilizza il nome della funzione senza un elenco di argomenti si determina un puntatore a funzione che è convertibile in diversi tipi. Questo codice viene generalmente compilato determinando un comportamento imprevisto in fase di esecuzione.La classe deve essere accessibile a una dichiarazione friend.
Nei compilatori Visual C++ precedenti a Visual C++ 2005 era consentita una dichiarazione friend per una classe non accessibile nell'ambito della classe contenente la dichiarazione. Adesso il compilatore genererà Errore del compilatore C2248. Per risolvere questo errore, modificare l'accessibilità della classe specificata nella dichiarazione friend. Questa modifica è stata apportata in conformità allo standard C++.__int che asm 3 adesso viene compilato in nativo
In caso di compilazione con /clr, __asm int 3 non produceva la generazione del codice nativo. Il compilatore traduceva l'istruzione a un'istruzione di interruzione di CLR. In Visual C++ 2005, __asm int 3 ora comporta la generazione del codice nativo per la funzione. Se si vuole che una funzione provochi un punto di interruzione nel codice e se si vuole che la funzione sia compilata in MSIL, utilizzare __debugbreak. Per ulteriori informazioni, vedere __asm e /clr (Compilazione Common Language Runtime). Questa modifica è stata eseguita per rendere più deterministica la generazione del codice nativo rispetto a quello gestito. Il codice assembly inline deve generare un codice nativo.La specializzazione esplicita non è consentita come costruttore di copia e operatore di assegnazione di copia.
Il codice che dipende dalla specializzazione esplicita dei modelli per un costruttore di copia o un operatore di assegnazione di copia genererà Errore del compilatore C2299. Questa operazione non è consentita in Standard C++. La modifica è stata effettuata per motivi di conformità, allo scopo di migliorare la portabilità del codice.I modelli di classe non specializzati non possono essere utilizzati come argomenti di modello in un elenco di classi di base.
L'utilizzo di un nome di classe di modello non specializzato nell'elenco di classi di base relativo a una definizione di classe genererà Errore del compilatore C3203. L'utilizzo di un nome di classe di modello non specializzato come parametro di modello in un elenco di classi di base non è consentito. Se il nome di classe di modello viene utilizzato come parametro di modello in un elenco di classi di base, è necessario aggiungervi in modo esplicito i parametri del tipo di modello. La modifica è stata effettuata per motivi di conformità, allo scopo di migliorare la portabilità del codice.Le dichiarazioni using di tipo nidificato non sono più consentite.
Il codice che presenta una dichiarazione using di tipo nidificato genererà Errore del compilatore C2885. Per risolvere questo errore, è necessario utilizzare riferimenti completi ai tipi nidificati, inserire il tipo in uno spazio dei nomi oppure creare un typedef. La modifica è stata effettuata per motivi di conformità, allo scopo di migliorare la portabilità del codice.Il compilatore non consente a const_cast il downcast in /clr:oldSyntax
Prima di Visual C++ 2005 il compilatore di Visual C++ consentiva a const_cast Operator il downcast durante la compilazione del codice sorgente che utilizza la sintassi delle estensioni gestite di C++. L'esecuzione di un downcast con const_cast ora genera Errore del compilatore C2440. L'errore può essere corretto utilizzando l'operatore cast appropriato. Per ulteriori informazioni al riguardo, vedere Casting Operators. Questa modifica è stata apportata per ragioni di conformità.Il compilatore impedisce la dichiarazione con prototipo della funzione di un'enum gestita
Prima di Visual C++ 2005 il compilatore di Visual C++ consentiva dichiarazioni con prototipo della funzione di enum gestite. Adesso, la dichiarazione senza la definizione di una enum gestita durante la compilazione con qualsiasi modulo di /clr genera Errore del compilatore C2599. Per risolvere il problema, definire sempre le enum gestite nella dichiarazione. Questa modifica è stata apportata perché il corretto funzionamento delle dichiarazioni con prototipo della funzione delle enum gestite non era garantito: il compilatore non riusciva a identificare correttamente il tipo sottostante di enum. Inoltre, C++ Standard non consente le dichiarazioni dell'enum.L'opzione del compilatore /YX è stata rimossa.
L'opzione del compilatore /YX generava il supporto di intestazioni precompilate automatiche era utilizzata per impostazione predefinita dall'ambiente di sviluppo. Se si rimuove /YX dalle configurazioni della build senza eseguire sostituzioni, sarà possibile ottenere generazioni più rapide. Oltre alla possibilità di un comportamento imprevisto con l'opzione /YX, è preferibile utilizzare /Yc (Crea il file di intestazione precompilato) e /Yu (Utilizza il file di intestazione precompilato), in modo da disporre di maggiore controllo sulle modalità di utilizzo delle intestazioni precompilate.Le opzioni del compilatore /Oa e /Ow sono state rimosse.
Le opzioni del compilatore /Ow e /Oa sono state rimosse e saranno ignorate senza visualizzare alcun messaggio. Utilizzare il modificatore noalias o restrict__declspec per specificare il modo in cui il compilatore utilizza gli alias.L'opzione del compilatore /Op è stata rimossa.
L'opzione del compilatore /Op è stata rimossa. In alternativa, utilizzare la funzione /fp (Specifica il comportamento della virgola mobile).Le opzioni del compilatore /ML e /MLd sono state rimosse
In Visual C++ non è più fornito il supporto delle librerie CRT a thread singolo collegate in modo statico. In alternativa, utilizzare /MT e /MTd. Per ulteriori informazioni, vedere C Run-Time Libraries.Le opzioni del compilatore /G3, /G4, /G5, /G6, /G7 e /GB sono state rimosse
Attualmente il compilatore utilizza un modello misto in base al quale viene eseguito un tentativo di creare il file di output ottimale per tutte le architetture.L'opzione /Gf è stata rimossa
In alternativa, utilizzare /GF (Elimina stringhe duplicate). Mediante l'opzione /GF le stringhe in pool vengono inserite in una sezione in sola lettura, più sicura rispetto alla sezione scrivibile in cui venivano aggiunte mediante l'opzione /Gf./clr non è compatibile con /MT.
Non c'è supporto nella Libreria C di runtime per il collegamento statico a un'applicazione gestita. Tutte le applicazioni gestite dovevano essere collegate (/MD) dinamicamente. Per ulteriori informazioni sulle limitazioni per l'utilizzo di /clr vedere Limitazioni di /clr.L'opzione /GS è ora attiva per impostazione predefinita.
Il controllo dell'overflow è attivo per impostazione predefinita. È possibile disattivare il controllo del sovraccarico del buffer con l'opzione del compilatore /GS-. Per ulteriori informazioni, vedere /GS (Controllo protezione buffer).L'opzione /Zc:wchar_t è ora attiva per impostazione predefinita.
Nel comportamento Standard C++, una variabile wchar_t utilizzerà per impostazione predefinita il tipo incorporato invece di un valore short integer senza segno. Questa modifica compromette la compatibilità binaria se il codice client è collegato a librerie compilate senza /Zc:wchar_t (LNK2019). Per tornare al comportamento precedente, non standard, utilizzare /Zc:wchar_t-. Questa modifica è stata introdotta per creare un codice conforme per impostazione predefinita.
Per ulteriori informazioni, vedere [/Zc:wchar\_t (Tipo nativo wchar\_t)](dh8che7s\(v=vs.90\).md).
- L'opzione /Zc:forScope è ora attiva per impostazione predefinita.
Nel comportamento Standard C++, il codice che dipende dall'utilizzo di una variabile dichiarata in un ciclo for al termine dell'ambito del ciclo for non riuscirà ad eseguire la compilazione. Per tornare al comportamento precedente, non standard, utilizzare /Zc:forScope-. Questa modifica è stata introdotta per creare un codice conforme per impostazione predefinita.
Per ulteriori informazioni, vedere [/Zc:forScope (Imponi conformità nell'ambito di un ciclo For)](84wcsx8x\(v=vs.90\).md).
Applicazione del controllo dei parametri per gli attributi Visual C++
Il codice che trasmette gli attributi denominati al costruttore di attributi utilizzando le virgolette quando non si tratta di una stringa e non utilizzandole quando il tipo è una stringa genererà Errore del compilatore C2065 o Avviso del compilatore (livello 1) C4581. In precedenza, tutti gli attributi del compilatore venivano analizzati come stringhe e, se necessario, il compilatore stesso inseriva le virgolette mancanti. Il supporto degli attributi veniva migliorato mediante l'aggiunta della convalida di controllo dei parametri. Questa modifica impedisce comportamenti imprevisti dovuti ad argomenti non corretti in un costruttore di attributo.Per questa versione non è possibile avere una stringa di caratteri multi-byte (Multibyte Character Set) per tutti gli argomenti in un attributo che considera una stringa implicita come argomento, anche se la stringa è tra virgolette. In questo caso potrebbe prodursi un file .idl corrotto. La soluzione alternativa è quella illustrata di seguito:
#define ARG string_with_MBCS_chars [helpstring(ARG)]
Il compilatore ora richiede la stessa specifica del modello per più dichiarazioni dello stesso tipo.
Se si dispone di una dichiarazione con prototipo della funzione in modo da poter creare friend in quel tipo, ad esempio, la specifica del modello del tipo deve essere la stessa su tutte le dichiarazioni per il tipo. In caso contrario, il compilatore genererà Errore del compilatore C2990.l'attributo uuid non può indirizzare più tipi gestiti
All'attributo uuid (C++ Attributes) era consentito l'utilizzo di un attributo definito dall'utente utilizzando le estensioni gestite di C++, ma ora genererà Errore del compilatore C3451. In alternativa, utilizzare GuidAttribute.Modifica della sintassi per passare le matrici gestite agli attributi personalizzati
Il tipo di matrice non è dedotto più dall'elenco delle inizializzazioni di aggregazione. Il compilatore richiede la specifica del tipo di matrice e dell'elenco di inizializzatori. La sintassi obsoleta ora genererà Errore del compilatore C3104. Questa modifica era necessaria in quanto il compilatore non poteva correttamente dedurre il tipo di matrice dall'elenco delle inizializzazioni di aggregazione.Il compilatore non inserirà int come tipo predefinito nelle dichiarazioni
Il codice in cui una dichiarazione non presenta il tipo non utilizzerà più il tipo int e il compilatore genererà Avviso del compilatore C4430 o Avviso del compilatore (livello 4) C4431. Lo Standard C++ non supporta l'int predefinito e questa modifica consentirà di ottenere il tipo desiderato.dynamic_cast ha migliorato la conformità allo standard C++.
La libreria di runtime C ora esegue un controllo in fase di esecuzione dynamic_cast per assicurare che il tipo di fase di compilazione dell'espressione di cui è eseguito il cast si riferisce a un sottoggetto di classe base pubblico del tipo di destinazione cast (per downcast) o del tipo di oggetto maggiormente derivato (per cross-cast). Per ulteriori informazioni, vedere Ultime modifiche a dynamic_cast.Non è possibile associare un valore rvalue a un riferimento non const.
Non è possibile associare un valore rvalue a un riferimento non const. Nelle versioni di Visual C++ precedenti era consentito associare un valore rvalue a un riferimento non const in un'inizializzazione diretta. Questo codice ora genera Avviso del compilatore (livello 1) C4350.I tipi valore non hanno più un costruttore predefinito. Questo causa l'esecuzione di inizializzatori tipo in diversi punti
Prima di Visual C++ 2005 i costruttori statici, ovvero gli inizializzatori tipo, nei tipi valore venivano eseguiti al momento di creazione dell'istanza di un tipo valore. Per garantire l'esecuzione dei costruttori statici, accedere a un membro dati statico o (/clr:oldSyntax solo) definire un costruttore di istanza. Non viene fornito un costruttore predefinito per i tipi valore dal momento che il Common Language Runtime non garantisce la chiamata di un costruttore predefinito. Inoltre, dal momento che non viene fornito un costruttore predefinito per i tipi valore le prestazioni sono migliori.I tipi valore boxed ora sono di sola lettura nei contesti verificabili (/clr:safe).
Il Common Language Runtime non consente più di modificare un tipo valore boxed durante la compilazione di un assembly verificabile. Il compilatore ora genera Avviso del compilatore C4972 quando viene rilevato.C4792 viene generato esclusivamente se si modifica il valore dell'oggetto sottostante mediante l'oggetto valore boxed. L'errore non si verificherà se viene modificata una copia dell'oggetto valore (ad esempio, modificando un oggetto boxed)
I tipi nativi sono privati per impostazione predefinita al di fuori dell'assembly
I tipi nativi ora non saranno per impostazione predefinita visibili fuori dall'assembly. Per le ulteriori informazioni sulla visibilità del tipo fuori dall'assembly, vedere Type Visibility. Questa modifica è stata effettuata principalmente alla luce delle necessità degli sviluppatori che utilizzano altri linguaggi che fanno distinzione tra maiuscole e minuscole per fare riferimento ai metadati creati in Visual C++./clr ora accetta la nuova sintassi CLR per Visual C++
Prima di Visual C++ 2005, la sintassi delle estensioni gestite di C++ veniva compilata da /clr. Adesso /clr compila la nuova sintassi CLR e ./clr:oldSyntax compila la sintassi delle estensioni gestite di C++. Per ulteriori informazioni su /clr, vedere /clr (Compilazione Common Language Runtime). Per ulteriori informazioni sulla nuova sintassi, vedere Language Features for Targeting the CLR./clr non compila più i file del codice sorgente nel linguaggio C
Prima di Visual C++ 2005, i file del codice sorgente del linguaggio C venivano compilati con /clr, tuttavia questo ora genererà Errore della riga di comando D8045. Per risolvere il problema, modificare l'estensione del file in .cpp o .cxx o compilare con /TP o /Tp. Per ulteriori informazioni, vedere /Tc, /Tp, /TC, /TP (Specifica il tipo di file di origine).Modifiche MSIL durante il test di eguaglianza
Per ulteriori informazioni, vedere Procedura: verificare l'uguaglianza.