Ultime modifiche in Visual C++
In questo documento sono elencate le ultime modifiche in Visual C++ 2010.
Compilatore Visual C++
La parola chiave Auto ha acquisito un nuovo significato predefinito. Poiché questa parola chiave viene utilizzata raramente nel suo significato precedente, la maggior parte delle applicazioni non sarà interessata da questa modifica.
È stata introdotta la nuova parola chiave static_assert, la quale provocherà un conflitto di nomi se nel codice è già presente un identificatore con lo stesso nome.
Il supporto per la nuova notazione lambda esclude il supporto per la codifica di un GUID non racchiuso tra virgolette in un attributo uuid IDL.
In .NET Framework 4 è stato introdotto il concetto di eccezioni di stato danneggiato, ovvero eccezioni che lasciano un processo in uno stato di danneggiamento irreversibile. Per impostazione predefinita, non è possibile rilevare un'eccezione di stato danneggiato, anche se si utilizza l'opzione del compilatore /EHa che rileva tutte le altre eccezioni.
Per rilevare in modo esplicito un'eccezione di stato danneggiato, utilizzare le istruzioni __try-__except. In alternativa, applicare l'attributo [HandledProcessCorruptedStateExceptions] per consentire a una funzione di rilevare eccezioni di stato danneggiato.
Questa modifica interessa principalmente i programmatori di sistema che potrebbero avere la necessità di rilevare un'eccezione di stato danneggiato. Le otto eccezioni sono STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION, STATUS_UNWIND_CONSOLIDATE. Per ulteriori informazioni su queste eccezioni, vedere la macro GetExceptionCode.
La nuova opzione del compilatore /GS protegge dai sovraccarichi del buffer in modo più completo rispetto alle versioni precedenti. Questa versione potrebbe determinare l'inserimento di controlli di sicurezza aggiuntivi nello stack con possibile riduzione delle prestazioni. Utilizzare la nuova parola chiave __declspec(safebuffers) per indicare al compilatore di non inserire controlli di sicurezza per una particolare funzione.
Se si esegue la compilazione sia con l'opzione del compilatore /GL (Ottimizzazione intero programma) sia con l'opzione /clr (Compilazione Common Language Runtime), l'opzione /GL viene ignorata. Questa modifica è stata apportata in quanto la combinazione di opzioni del compilatore non risulta particolarmente vantaggiosa. Questa modifica ha determinato un miglioramento delle prestazioni di compilazione.
Per impostazione predefinita, il supporto dei trigrammi è disabilitato in Visual C++ 2010. Occorre utilizzare l'opzione del compilatore /Zc:trigraphs per abilitare il supporto dei trigrammi. Un trigramma è costituito da due punti interrogativi consecutivi ("??") seguiti da un terzo carattere univoco. Il compilatore sostituisce un trigramma con il carattere di punteggiatura corrispondente. Ad esempio, il compilatore sostituisce il trigramma "?? =" con il simbolo di cancelletto (#). Utilizzare i trigrammi in file di origine C che utilizzano un set di caratteri che non contiene rappresentazioni grafiche adeguate per alcuni caratteri di punteggiatura.
Il linker non supporta più l'ottimizzazione per Windows 98. L'opzione /OPT (Ottimizzazioni) genera un errore in fase di compilazione se si specifica /OPT:WIN98 o /OPT:NOWIN98.
Le opzioni del compilatore predefinite specificate dalle proprietà del sistema di compilazione RuntimeLibrary e DebugInformationFormat sono state modificate. Per impostazione predefinita, queste proprietà di compilazione vengono specificate nei progetti creati da Visual C++ versioni da 7.0 a 10.0. Se si esegue la migrazione di un progetto creato da Visual C++ 6.0, considerare la possibilità di specificare un valore per queste proprietà.
In Visual C++ 2010, RuntimeLibrary = MultiThreaded (/MD) e DebugInformationFormat = ProgramDatabase (/Zi). In Visual C++ 9.0, RuntimeLibrary = MultiThreaded (/MT) e DebugInformationFormat = Disabled.
Common Language Runtime (CLR)
- I compilatori Microsoft C# e Visual Basic sono ora in grado di produrre un assembly No-PIA (No Primary Interop Assembly). Un assembly No-PIA può utilizzare tipi COM senza la distribuzione dell'assembly di interoperabilità primario (PIA) rilevante. Quando si utilizzano assembly No-PIA prodotti da Visual C# o Visual Basic, è necessario fare riferimento all'assembly PIA nel comando del compilatore prima di fare riferimento agli assembly No-PIA che utilizzano la libreria.
Progetti di Visual C++ e MSBuild
I progetti Visual C++ sono ora basati sullo strumento MSBuild. I file di progetto utilizzano di conseguenza un nuovo formato di file XML e un suffisso di file .vcxproj. In Visual C++ 2010 i file di progetto creati in versioni precedenti di Visual Studio vengono convertiti automaticamente nel nuovo formato di file.
Un progetto è interessato da questa modifica se dipende dallo strumento di compilazione precedente VCBUILD.exe o dal suffisso del file di progetto .vcproj.
Nelle versioni precedenti, Visual C++ supportava la valutazione tardiva di finestre delle proprietà. Ad esempio, una finestra delle proprietà padre poteva importare una finestra delle proprietà figlio e il padre poteva utilizzare una variabile definita nel figlio per definire altre variabili. La valutazione tardiva consentiva al padre di utilizzare la variabile figlio anche prima dell'importazione della finestra delle proprietà figlio. In Visual C++ 2010, una variabile del foglio di progetto non può essere utilizzata prima che sia definita perché MSBuild supporta solo la valutazione precoce.
Ambiente di sviluppo integrato
La finestra di dialogo di terminazione dell'applicazione non consente più di terminare un'applicazione.
Nelle versioni precedenti quando la funzione abort() o terminate() chiude la build per la vendita di un'applicazione, la libreria di runtime del linguaggio C visualizza un messaggio di terminazione dell'applicazione in una finestra della console o in una finestra di dialogo. Il messaggio informa che l'applicazione ha richiesto la terminazione del runtime in modo anomalo. Per ulteriori informazioni contattare il team di supporto".
Il messaggio di terminazione dell'applicazione è ridondante in quanto in Windows viene visualizzato successivamente il gestore di terminazione corrente, che corrisponde in genere alla finestra di dialogo di Segnalazione errori Windows (Dr. Watson) o al debugger di Visual Studio. A partire da Visual Studio 2010, la libreria di runtime del linguaggio C non visualizza il messaggio. Il runtime impedisce inoltre la terminazione dell'applicazione prima dell'avvio di un debugger.
Si tratta di una modifica importante solo se si dipende dal comportamento precedente del messaggio di terminazione dell'applicazione.
Nello specifico per Visual Studio 2010, IntelliSense non funziona per codice o attributi C++/CLI, Trova tutti i riferimenti non funziona per le variabili locali e Modello codice non consente di recuperare nomi di tipi da assembly importati o risolvere i tipi nei relativi nomi completi.
Librerie di Visual C++
La classe SafeInt è inclusa in Visual C++ e non è più disponibile in un download separato. Si tratta di una modifica importante solo se è stata sviluppata una classe denominata "SafeInt".
Il modello di distribuzione delle librerie non utilizza più i manifesti per trovare una determinata versione di una libreria a collegamento dinamico. Al contrario, il nome di ogni libreria a collegamento dinamico contiene il relativo numero di versione. Tale nome viene utilizzato per individuare la libreria. Per ulteriori informazioni, vedere Distribuzione in Visual C++ 2010.
Nelle versioni precedenti di Visual Studio, è possibile ricompilare le librerie di runtime. Visual C++ 2010 non supporta più la compilazione delle proprie copie dei file della libreria di runtime del linguaggio C.
Libreria di modelli standard
L'intestazione <iterator> non viene più inclusa automaticamente da molti altri file di intestazione. Al contrario, si consiglia di includere l'intestazione in modo esplicito se si richiede supporto per gli iteratori autonomi definiti nell'intestazione <interator>.
Nell'intestazione <algorithm> sono state rimosse le funzioni checked_* e unchecked_*. Nell'intestazione <iterator> è stata rimossa la classe checked_iterator ed è stata aggiunta la classe unchecked_array_iterator.
Il costruttore CComPtr::CComPtr(int) è stato rimosso. Tale costruttore consentiva la costruzione di un oggetto CComPtr dalla macro NULL, ma era di poca utilità e consentiva costruzioni insensate da Integer diversi da zero.
È ancora possibile costruire un oggetto CComPtr da NULL, che è definito come 0, ma la costruzione non riuscirà se l'oggetto è costruito da un Integer diverso dal valore letterale 0. È molto probabile che questo problema si presenti nella situazione descritta dal seguente pseudocodice.
pair<X, CComPtr<T>> myVar; myVar = make_pair(x, NULL);
Per correggere la seconda istruzione, utilizzare la parola chiave nullptr anziché la macro NULL.
myVar = make_pair(x, nullptr)
Le seguenti funzioni membro ctype sono state rimosse: ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s. Se un'applicazione utilizza una di queste funzioni membro, è necessario sostituirla con la corrispondente versione non sicura: ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.
Librerie CRT, MFC e ATL
È stato rimosso il supporto per gli utenti per la compilazione delle librerie CRT, MFC e ATL. Non viene ad esempio fornito un file nmake appropriato. Gli utenti tuttavia dispongono ancora dell'accesso al codice sorgente per queste librerie. Nel blog del team di Visual C++ verrà probabilmente inserito un documento in cui vengono descritte le opzioni di MSBuild utilizzate da Microsoft per la compilazione di queste librerie.
Il supporto MFC per IA64 è stato rimosso. Viene tuttavia ancora fornito il supporto per CRT e ATL su IA64.
Gli ordinali non vengono più riutilizzati nei file di definizione moduli (.def) MFC. Questa modifica indica che gli ordinali non saranno diversi tra versioni minori e che la compatibilità binaria per le versioni di Service Pack e Quick Fix Engineering verrà migliorata.
Una nuova funzione virtuale è stata aggiunta alla classe CDocTemplate. Questa nuova funzione è CDocTemplate::OpenDocumentFile. La versione precedente di OpenDocumentFile disponeva di due parametri. La nuova versione dispone di tre parametri. Per supportare Gestione riavvio, tutte le classi derivate da CDocTemplate devono implementare la versione con tre parametri. Per ulteriori informazioni sulla funzione, vedere CDocTemplate::OpenDocumentFile. Il nuovo parametro è bAddToMRU.
Macro e variabili di ambiente
- La variabile di ambiente __MSVCRT_HEAP_SELECT non è più supportata. Questa variabile di ambiente è stata rimossa e non è stata sostituita.
Riferimento a Microsoft Macro Assembler
- Diverse direttive sono state rimosse dal compilatore Riferimento a Microsoft Macro Assembler. Le direttive rimosse sono: .186, .286, .286P, .287, .8086, .8087 e .NO87.