Panoramica dei potenziali problemi di aggiornamento (Visual C++)Overview of potential upgrade issues (Visual C++)

Nel corso degli anni il compilatore Visual C++ ha subito molte modifiche, che si aggiungono alle modifiche apportate al linguaggio C++, alla libreria standard C++, al runtime C (CRT) e ad altre librerie come MFC e ATL.Over the years, the Visual C++ compiler has undergone many changes, along with changes in the C++ language itself, the C++ Standard Library, the C runtime (CRT), and other libraries such as MFC and ATL. Di conseguenza, quando si aggiorna un'applicazione da una versione precedente di Visual C++ è possibile che il codice che prima veniva compilato correttamente mostri errori e avvisi del compilatore e del linker.As a result, when upgrading an application from an earlier version of Visual C++ you might encounter compiler and linker errors and warnings in code that previously compiled cleanly. Più la base di codice è vecchia, maggiore è la possibilità di tali errori.The older the original code base, the greater the potential for such errors. Questa panoramica riepiloga i tipi di problemi più comuni che possono verificarsi e offre collegamenti a informazioni più dettagliate.This overview summarizes the most common classes of issues you are likely to encounter, and provides links to more detailed information.

Nota: In passato si consigliava di eseguire in modo incrementale, una versione alla volta, gli aggiornamenti che includevano più versioni.Note: In the past, we have recommended that upgrades that span several versions of Visual Studio should be performed incrementally one version at a time. Questo approccio non è più consigliato.We no longer recommend this approach. Si è constatato che è quasi sempre più semplice eseguire l'aggiornamento diretto alla versione più recente di Visual Studio, indipendentemente dalla versione della base di codice.We have found that it is almost always simpler to upgrade to the most current version of Visual Studio no matter how old the code base.

È possibile inviare domande o commenti sul processo di aggiornamento all'indirizzo vcupgrade@microsoft.com.Questions or comments about the upgrade process can be sent to vcupgrade at microsoft.

Dipendenze di librerie e set di strumentiLibrary and toolset dependencies

Quando si aggiorna un'applicazione a una nuova versione del compilatore Visual C++, è vivamente consigliabile e in molti casi necessario aggiornare anche tutte le librerie e le DLL alle quali è collegata l'applicazione.When upgrading an application to a new version of the Visual C++ compiler, it is strongly advisable and in many cases necessary to also upgrade all libs and DLLs that the application links to. Ciò richiede l'accesso al codice sorgente oppure la fornitura da parte del produttore della libreria di nuovi file binari compilati con la stessa versione principale del compilatore Visual C++.This requires either that you have access to the source code, or that the library vendor can provide new binary files compiled with the same major version of the Visual C++ compiler. Se una di queste condizioni è vera è possibile ignorare questa sezione, che illustra i dettagli della compatibilità binaria.If one of these conditions is true, then you can skip this section, which deals with the details of binary compatibility. Se nessuna delle due condizioni è vera, potrebbe non risultare possibile usare le librerie nell'applicazione aggiornata.If neither of these are the case, then you might not be able to use the libraries in your upgraded application. Le informazioni contenute in questa sezione contribuiscono a determinare se sarà possibile procedere con l'aggiornamento.The information in this section will help you understand whether you can proceed with the upgrade.

Set di strumentiToolset

I formati di file obj e lib sono definiti in modo completo e vengono modificati di rado.The obj and lib file formats are well-defined and rarely change. Talvolta vengono eseguite aggiunte a questi formati di file, ma tali aggiunte in genere non influenzano la capacità dei set di strumenti più recenti di usare file oggetto e librerie prodotte da set di strumenti meno recenti.Sometimes additions are made to these file formats, but these additions generally do not affect the ability of newer toolsets to consume object files and libraries produced by older toolsets. L'unica eccezione importante è la compilazione con /GL (Generazione di codice in fase di collegamento/Ottimizzazione intero programma).The one big exception here is if you compile using /GL (Link-Time Code Generation / Whole Program Optimization). Se si esegue la compilazione usando /GL, il file oggetto risultante può essere collegato solo mediante lo stesso set di strumenti usato per la sua creazione.If you compile using /GL, the resulting object file can only be linked using the same toolset that was used to produce it. Pertanto, se si genera un file oggetto con /GL e si usa il compilatore di Visual Studio 2017 (v141), è necessario collegare il file oggetto mediante il linker di Visual Studio 2017 (v141).So, if you produce an object file with /GL and using the Visual Studio 2017 (v141) compiler, you must link it using the Visual Studio 2017 (v141) linker. Il motivo è il fatto che le strutture dati interne degli oggetti /GL non sono stabili tra diverse versioni principali del set di strumenti e i set più recenti non supportano i formati di dati meno recenti.This is because the internal data structures within the /GL objects are not stable across major versions of the toolset and newer toolsets do not understand the older data formats.

C++ non dispone di un'interfaccia binaria dell'applicazione (ABI) stabile.C++ does not have a stable application binary interface (ABI). Visual C++ gestisce un'ABI stabile per tutte le versioni secondarie di una versione principale.Visual C++ maintains a stable ABI for all minor versions of a release. Ad esempio, Visual Studio 2017 e tutti i relativi aggiornamenti sono compatibili a livello binario.For example, Visual Studio 2017 and all its updates are binary compatible. Tuttavia l'ABI non è necessariamente compatibile tra versioni principali di Visual C++ (ad eccezione delle versioni 2015 e 2017, che sono compatibili a livello binario).But the ABI is not necessarily compatible across major versions of Visual C++ (except for 2015 and 2017, which are binary compatible). In altri termini è possibile che vengano apportate modifiche di rilievo al layout di tipo, alla decorazione dei nomi, alla gestione delle eccezioni e ad altre parti dell'ABI C++.That is, we may make breaking changes to C++ type layout, name decoration, exception handling, and other parts of the C++ ABI. Pertanto, se è presente un file oggetto che include simboli esterni con collegamento a C++, tale file oggetto potrebbe non collegarsi correttamente con file oggetto creati con un'altra versione principale del set di strumenti Visual C++.Thus, if you have an object file that has external symbols with C++ linkage, that object file may not link correctly with object files produced with a different major version of the Visual C++ toolset. In questo caso, "potrebbe non collegarsi" può dare risultati diversi: il collegamento può non riuscire affatto (ad esempio in caso di modifica della decorazione dei nomi), il collegamento può riuscire e possono verificarsi errori in fase di runtime (ad esempio in caso di modifica del layout di tipo) o come accade in molti casi il collegamento può funzionare e non originare alcun errore.Note that here, "may not work" has many possible outcomes: the link may fail entirely (e.g. if name decoration changed), the link may succeed and things may not work at runtime (e.g. if type layout changed), or things may happen to work in many cases and nothing will go wrong. Si noti anche che sebbene l'ABI C++ non sia stabile, l'ABI C e il subset dell'ABI C++ necessaria per COM sono stabili.Note also that while the C++ ABI is not stable, the C ABI and the subset of the C++ ABI required for COM are stable.

LibrerieLibraries

Se si compila un file di origine usando una versione particolare delle intestazioni delle librerie di Visual C++ (usando #include per le intestazioni), il file oggetto risultante deve essere collegato con la stessa versione delle librerie di Visual C++.If you compile a source file using a particular version of the Visual C++ libraries headers (by #including the headers), the resulting object file must be linked with the same version of the Visual C++ libraries. Se ad esempio il file di origine viene compilato con <immintrin.h> di Visual Studio 2017, è necessario collegarlo con la libreria vcruntime di Visual Studio 2017.So, for example, if your source file is compiled with the Visual Studio 2017 <immintrin.h>, you must link with the Visual Studio 2017 vcruntime library. In modo analogo, se il file di origine viene compilato con <iostream> di Visual Studio 2017 è necessario collegarlo con la libreria standard C++ di Visual Studio 2017, msvcprt.Similarly, if your source file is compiled with the Visual Studio 2017 <iostream>, you must link with the Visual Studio 2017 Standard C++ library, msvcprt. L'uso di elementi di versioni diverse non è supportato.Mixing-and-matching is not supported.

Per la libreria standard C++ l'uso di elementi di versioni diverse è stato esplicitamente disattivato con l'introduzione di #pragma detect_mismatch nelle intestazioni standard a partire da Visual Studio 2010.For the C++ Standard Library, mixing-and-matching has been explicitly disallowed via use of #pragma detect_mismatch in the standard headers since Visual Studio 2010. Se si prova a collegare file oggetto incompatibili o di creare un collegamento con una libreria standard non adatta, il collegamento non funziona.If you try to link incompatible object files, or if you try to link with the wrong standard library, the link will fail.

Per la libreria CRT, l'uso di elementi di versioni diverse non è mai stato supportato ma funzionava in molti casi, almeno fino a Visual Studio 2015 e alla libreria Universal CRT, in quanto la superficie API ha subito variazioni minime nel corso del tempo.For the CRT, mixing-and-matching was never supported, but it often just worked, at least until Visual Studio 2015 and the Universal CRT, because the API surface did not change much over time. Con la libreria Universal CRT è stata interrotta la compatibilità con le versioni precedenti, che ora è soggetta a gestione.The Universal CRT broke backwards compatibility so that in the future we can maintain backwards compatibility. In altre parole non è prevista l'introduzione di nuove versioni di file binari Universal CRT in futuro.In other words, we have no plans to introduce new, versioned Universal CRT binaries in the future. Al contrario, ora viene aggiornata la libreria Universal CRT esistente.Instead, the existing Universal CRT is now updated in-place.

Per garantire la compatibilità di collegamento parziale con file oggetto (e librerie) compilati con versioni precedenti delle intestazioni del runtime Microsoft C, è disponibile la libreria legacy_stdio_definitions.lib con Visual Studio 2015 e versioni successive.To provide partial link compatibility with object files (and libraries) compiled with older versions of the Microsoft C Runtime headers, we provide a library, legacy_stdio_definitions.lib, with Visual Studio 2015 and later. Questa libreria include simboli di compatibilità per la maggior parte delle funzioni e delle esportazioni dati che sono state rimosse da Universal CRT.This library provides compatibility symbols for most of the functions and data exports that were removed from the Universal CRT. Il set di simboli di compatibilità offerto da legacy_stdio_definitions.lib è sufficiente a soddisfare la maggior parte delle dipendenze, incluse tutte le dipendenze delle librerie incluse in Windows SDK.The set of compatibility symbols provided by legacy_stdio_definitions.lib is sufficient to satisfy most dependencies, including all of the dependencies in libraries included in the Windows SDK. Tuttavia, per alcuni simboli rimossi da Universal CRT non è possibile offrire simboli di compatibilità in questo modo.However, there are some symbols that were removed from the Universal CRT for which it is not possible to provide compatibility symbols like this. Questi simboli includono alcune funzioni (ad esempio __iob_func) e le esportazioni di dati (ad esempio __imp___iob, __imp___pctype, __imp___mb_cur_max).These symbols include some functions (e.g., __iob_func) and the data exports (e.g., __imp___iob, __imp___pctype, __imp___mb_cur_max).

Se è presente una libreria statica creata con una versione precedente delle intestazioni del runtime C, è consigliabile adottare le seguenti misure (nell'ordine indicato):If you have a static library that was built with an older version of the C Runtime headers, we recommend the following actions (in this order):

  1. Ricompilare la libreria statica con Visual C++ 2017 e le intestazioni Universal CRT per garantire il supporto del collegamento con la libreria Universal CRT.Rebuild the static library using Visual C++ 2017 and the Universal CRT headers to support linking with the Universal CRT. Questa è l'opzione completamente supportata (e pertanto migliore).This is the fully supported (and thus best) option.

  2. Se non è possibile (o non si vuole) ricompilare la libreria statica, è possibile provare il collegamento con legacy_stdio_definitions.lib.If you cannot (or do not want to) rebuild the static library, you may try linking with legacy_stdio_definitions.lib. Se questa soluzione soddisfa le dipendenze in fase di collegamento della libreria statica, è consigliabile testare in modo approfondito la libreria statica quando viene usata nel codice binario, per assicurarsi che non dia origine a problemi causati da una delle modifiche funzionali apportate alla libreria Universal CRT.If it satisfies the link-time dependencies of your static library, you will want to thoroughly test the static library as it is used in the binary, to make sure that it is not adversely affected by any of the behavioral changes that were made to the Universal CRT.

  3. Se le dipendenze della libreria statica in uso non sono soddisfatte da legacy_stdio_definitions.lib o se la libreria non funziona con la libreria Universal CRT a causa delle modifiche funzionali sopra citate, è consigliabile incapsulare la libreria statica in una DLL e quindi collegare la DLL alla versione appropriata del runtime Microsoft C.If your static library’s dependencies are not satisfied by legacy_stdio_definitions.lib or if the library does not work with the Universal CRT due to the aforementioned behavioral changes, we would recommend encapsulating your static library into a DLL that you link with the correct version of the Microsoft C Runtime. Ad esempio, se la libreria statica è stata creata con Visual C++ 2013 sarà necessario creare la DLL usando Visual C++ 2013 e le librerie di Visual C++ 2013.For example, if the static library was built using Visual C++ 2013, you would want to build this DLL using Visual C++ 2013 and the Visual C++ 2013 libraries as well. Incorporando la libreria in una DLL si isola il dettaglio di implementazione rappresentato dalla dipendenza della libreria da una versione specifica del runtime Microsoft C.By building the library into a DLL, you encapsulate the implementation detail that is its dependency on a particular version of the Microsoft C Runtime. Sarà necessario assicurarsi che l'interfaccia della DLL non trasmetta esternamente dettagli del runtime C usato, ad esempio restituendo un'istruzione FILE* fuori dall'ambito della DLL o restituendo un puntatore allocato da malloc e prevedendone lo sblocco da parte del chiamante.(Note that you will want to be careful that the DLL interface does not leak details of which C Runtime it uses, e.g. by returning a FILE* across the DLL boundary or by returning a malloc-allocated pointer and expecting the caller to free it.)

    L'uso di più CRT in un unico processo non è di per sé un problema; di fatto la maggior parte dei processi carica DLL con più CRT. Ad esempio i componenti del sistema operativo Windows dipendono da msvcrt.dll e mentre CLR dipende dal proprio CRT privato.Use of multiple CRTs in a single process is not in and of itself problematic (indeed, most processes will end up loading multiple CRT DLLs; for example, Windows operating system components will depend on msvcrt.dll and the CLR will depend on its own private CRT). I problemi si verificano quando si usa in modo non ordinato lo stato di più CRT.Problems arise when you jumble state from different CRTs. Ad esempio è sconsigliabile allocare memoria usando msvcr110.dll!malloc e provare a deallocare la memoria usando msvcr120.dll!free. Allo stesso modo è sconsigliabile provare ad aprire un FILE usando msvcr110!fopen e quindi provare a leggere il FILE usando msvcr120!fread.For example, you should not allocate memory using msvcr110.dll!malloc and attempt to deallocate that memory using msvcr120.dll!free, and you should not attempt to open a FILE using msvcr110!fopen and attempt to read from that FILE using msvcr120!fread. Se si evita di usare in modo non ordinato lo stato di più CRT, è possibile avere più CRT caricati in un singolo processo.As long as you don’t jumble state from different CRTs, you can safely have multiple CRTs loaded in a single process.

    Per altre informazioni, vedere Upgrade your code to the Universal CRT (Aggiornare il codice a Universal CRT).For more information, see Upgrade your code to the Universal CRT.

Errori causati da impostazioni di progettoErrors due to project settings

Per iniziare il processo di aggiornamento basta aprire un progetto/soluzione/area di lavoro precedente nella versione più recente di Visual Studio.To begin the upgrade process, simply open an older project/solution/workspace in the latest version of Visual Studio. In Visual Studio verrà creato un nuovo progetto basato sulle impostazioni di progetto precedenti.Visual Studio will create a new project based on the old project settings. Se il progetto precedente presenta percorsi di libreria o di inclusione hardcoded su percorsi non standard, i file in tali percorsi potrebbero non essere visibili al compilatore quando il progetto usa le impostazioni predefinite.If the older project has library or include paths that are hard-coded to non-standard locations, it is possible that the files in those paths won’t be visible to the compiler when the project uses the default settings. Per altre informazioni, vedere Configurazione della proprietà OutputFile del linker.For more information, see Linker OutputFile setting.

In generale, questo è il momento ideale per organizzare il codice del progetto in modo da semplificare la gestione, favorendo la compilazione del codice aggiornato in tempi rapidi.In general, now is a great time to organize your project code properly in order to simplify project maintenance and help get your upgraded code compiling as quickly as possible. Se il codice sorgente è già ben organizzato e il vecchio progetto viene compilato con Visual Studio 2010 o versioni successive, è possibile modificare manualmente il nuovo file di progetto in modo da supportare la compilazione sia con il nuovo che con il vecchio compilatore.If your source code is already well-organized, and your older project is compiled with Visual Studio 2010 or later, you can manually edit the new project file to support compilation on both the old and new compiler. Nell'esempio seguente viene illustrato come compilare sia per Visual Studio 2015 che per Visual Studio 2017:The following example shows how to compile for both Visual Studio 2015 and Visual Studio 2017:

<PlatformToolset Condition="'$(VisualStudioVersion)'=='14.0'">v140</PlatformToolset>  
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15.0'">v141</PlatformToolset>   

LNK2019: simbolo esterno non risoltoLNK2019: Unresolved external

Se vengono rilevati simboli non risolti, potrebbe essere necessario correggere le impostazioni del progetto.For unresolved symbols, you might need to fix up your project settings.

  • Se il file di origine si trova in un percorso non predefinito, è stato aggiunto il percorso delle directory di inclusione del progetto?If the source file is in a non-default location, did you add the path to the project’s include directories?

  • Se il simbolo esterno è definito in un file con estensione lib, è stato specificato il percorso lib nelle proprietà del progetto e nel percorso è presente la versione corretta del file con estensione lib?If the external is defined in a .lib file, have you specified the lib path in the project properties and is the correct version of the .lib file actually located there?

  • Si sta provando a creare ul collegamento a un file con estensione lib compilato con una versione diversa di Visual Studio?Are you attempting to link to a .lib file that was compiled with a different version of Visual Studio? In questo caso, vedere la sezione precedente relativa alle dipendenze di librerie e set di strumenti.If so, see the previous section on library and toolset dependencies.

  • I tipi degli argomenti nel sito di chiamata corrispondono di fatto a un overload esistente della funzione?Do the types of the arguments at the call site actually match an existing overload of the function? Verificare che i tipi sottostanti degli eventuali typedef nella firma della funzione e nel codice che chiama la funzione siano quelli previsti.Verify the underlying types for any typedefs in the function’s signature and in the code that calls the function are what you expect them to be.

    Per risolvere gli errori di simbolo non risolto, provare a usare dumpbin.exe per esaminare i simboli definiti in un file binario.To troubleshoot unresolved symbol errors, you can try using dumpbin.exe to examine the symbols defined in a binary. Provare la riga di comando seguente per visualizzare i simboli definiti in una libreria:Try the following command line to view symbols defined in a library:

dumpbin.exe /LINKERMEMBER somelibrary.lib  

/Zc:wchar_t (Tipo nativo wchar_t)/Zc:wchar_t (wchar_t Is Native Type)

In Visual C++ 6.0 e versioni precedenti, wchar_t non è implementato come tipo predefinito, ma è dichiarato in wchar.h come typedef per unsigned short. Lo standard C++ richiede che wchar_t sia un tipo incorporato.(In Visual C++ 6.0 and earlier, wchar_t was not implemented as a built-in type, but was declared in wchar.h as a typedef for unsigned short.) The C++ standard requires that wchar_t be a built-in type. L'uso della versione typedef può causare problemi di portabilità.Using the typedef version can cause portability problems. Se si esegue l'aggiornamento da versioni precedenti di Visual C++ e si verifica l'errore del compilatore C2664 perché il codice sta cercando di convertire in modo implicito wchar_t in unsigned short, è consigliabile modificare il codice per risolvere l'errore anziché impostare /Zc:wchar_t-.If you upgrade from earlier versions of Visual C++ and encounter compiler error C2664 because the code is trying to implicitly convert a wchar_t to unsigned short, we recommend that you change the code to fix the error, instead of setting /Zc:wchar_t-. Per altre informazioni, vedere /Zc:wchar_t (Tipo nativo wchar_t).For more information, see /Zc:wchar_t (wchar_t Is Native Type).

Aggiornare con le opzioni del linker /NODEFAULTLIB, /ENTRY e /NOENTRYUpgrading with the linker options /NODEFAULTLIB, /ENTRY, and /NOENTRY

L'opzione del linker /NODEFAULTLIB (o la proprietà del linker Ignora tutte le librerie predefinite) indica al linker di non collegare automaticamente le librerie predefinite, ad esempio la libreria CRT.The /NODEFAULTLIB linker option (or the Ignore All Default Libraries linker property) tells the linker not to automatically link in the default libraries such as the CRT. Ciò significa che ogni libreria deve essere elencata come input singolarmente.This means that each library has to be listed as input individually. Questo elenco di librerie è disponibile nella proprietà Dipendenze aggiuntive, nella sezione Linker delle proprietà del progetto.This list of libraries is given in the Additional Dependencies property in the Linker section of the Project Properties.

I progetti che usano questa opzione rappresentano un problema durante l'aggiornamento, perché i nomi di alcune librerie predefinite sono cambiati.Projects that use this option present a problem when upgrading, because the names of some of the default libraries have changed. Dato che ogni singola libreria va elencata nella proprietà Dipendenze aggiuntive o nella riga di comando del linker, è necessario aggiornare l'elenco di librerie in modo che usi i nomi correnti.Because each library has to be listed in the Additional Dependencies property or on the linker command line, you need to update the list of libraries to use the current names.

La tabella seguente visualizza le librerie delle quali è stato cambiato il nome a partire da Visual Studio 2015.The following table shows the libraries whose names changed starting with Visual Studio 2015. Per eseguire l'aggiornamento è necessario sostituire i nomi nella prima colonna con i nomi nella seconda colonna.To upgrade, you need to replace the names in the first column with the names in the second column. Alcune di queste librerie sono librerie di importazione, ma questo fatto non è rilevante.Some of these libraries are import libraries, but that shouldn’t matter.

Se si usava:If you were using: Sostituire con:You need to replace it with:
libcmt.liblibcmt.lib libucrt.lib, libvcruntime.liblibucrt.lib, libvcruntime.lib
libcmtd.liblibcmtd.lib libucrtd.lib, libvcruntimed.liblibucrtd.lib, libvcruntimed.lib
msvcrt.libmsvcrt.lib ucrt.lib, vcruntime.libucrt.lib, vcruntime.lib
msvcrtd.libmsvcrtd.lib ucrtd.lib, vcruntimed.libucrtd.lib, vcruntimed.lib

Lo stesso vale se si usa l'opzione /ENTRY o l'opzione /NOENTRY, che hanno anche l'effetto di ignorare le librerie predefinite.The same issue applies also if you use the /ENTRY option or the /NOENTRY option, which also have the effect of bypassing the default libraries.

Errori causati dal miglioramento della conformità al linguaggioErrors due to improved language conformance

Nel corso degli anni è stata migliorata in modo continuativo la conformità del compilatore Visual C++ allo standard C++.The Visual C++ compiler has continuously improved its conformance to the C++ standard over the years. Il codice che veniva compilato correttamente con versioni precedenti di Visual C++ potrebbe non essere compilato in Visual Studio 2017, perché ora il compilatore segnala correttamente un errore che in precedenza ignorava o autorizzava in modo esplicito.Code that compiled in earlier versions of Visual C++ might fail to compile in Visual Studio 2017 because the compiler correctly flags an error that it previously ignored or explicitly allowed.

Ad esempio, l'opzione /Zc:forScope è stata introdotta nelle prime versioni di Visual C++.For example, the /Zc:forScope switch was introduced early in the history of Visual C++. L'opzione consente un comportamento non conforme per le variabili di ciclo.It permits non-conforming behavior for loop variables. Questa opzione ora è deprecata e potrebbe essere rimossa nelle versioni future.That switch is now deprecated and might be removed in future versions. L'uso dell'opzione quando si aggiorna il codice è sconsigliato.It is highly recommended to not use that switch when upgrading your code. Per altre informazioni, vedere /Zc:forScope- è deprecata.For more information, see /Zc:forScope- is deprecated.

Un esempio di errore comune durante l'aggiornamento si verifica quando un argomento non const viene passato a un parametro const.One example of a common compiler error you might see when upgrading is when a non-const argument is passed to a const parameter. Le versioni meno recenti di Visual C++ non segnalavano sempre questa operazione come errore.Older versions of Visual C++ did not always flag this as an error. Per altre informazioni, vedere Conversioni più rigorose del compilatore.For more information, see The compiler's more strict conversions.

Per altre informazioni sui miglioramenti specifici della conformità, vedere Cronologia delle modifiche di Visual C++ dal 2003 al 2015 e Miglioramenti della conformità di C++ in Visual Studio 2017.For more information on specific conformance improvements, see Visual C++ change history 2003 - 2015 and C++ conformance improvements in Visual Studio 2017.

Errori con i tipi integrali <stdint.h>Errors involving <stdint.h> integral types

L'intestazione <stdint.h> definisce typedef e macro che, a differenza dei tipi integrali incorporati, hanno necessariamente una lunghezza specifica in tutte le piattaforme.The <stdint.h> header defines typedefs and macros that, unlike built-in integral types, are guaranteed to have a specified length on all platforms. Alcuni esempi sono uint32_t e int64_t.Some examples are uint32_t and int64_t. <stdint.h> è stata aggiunta a Visual C++ in Visual Studio 2010.Visual C++ added <stdint.h> in Visual Studio 2010. È possibile che il codice scritto con versioni precedenti alla 2010 offra definizioni private per questi tipi e che tali definizioni non siano sempre coerenti con quelle di <stdint.h>.Code that was written before 2010 might have provided private definitions for those types and those definitions might not always be consistent with the <stdint.h> definitions.

Se l'errore è C2371 e riguarda un tipo stdint, è probabile che il tipo sia definito in un'intestazione nel proprio codice o in un file lib di terze parti.If the error is C2371, and a stdint type is involved, it probably means that the type is defined in a header either in your code or a third-party lib file. Durante l'aggiornamento è necessario eliminare eventuali definizioni personalizzate di tipi <stdint.h>, ma prima confrontare le definizioni personalizzate con le definizioni standard correnti, per assicurarsi di non introdurre nuovi problemi.When upgrading, you should eliminate any custom definitions of <stdint.h> types, but first compare the custom definitions to the current standard definitions to ensure you are not introducing new problems.

È possibile premere F12 Vai a definizione per visualizzare la posizione in cui è definito il tipo in questione.You can press F12 Go to Definition to see where the type in question is defined.

L'opzione del compilatore /showIncludes può essere utile in questo contesto.The /showIncludes compiler option can be useful here. Nella finestra di dialogo Pagine delle proprietà per il progetto aprire la pagina C/C++, Avanzate e impostare Mostra inclusioni su .In the Property Pages dialog box for your project, open the C/C++, Advanced page and set Show Includes to Yes. Ricompilare il progetto e visualizzare l'elenco di #include (inclusioni) nella finestra di output.Then rebuild your project and see the list of #includes in the output window. Ogni intestazione è provvista di un rientro sotto l'intestazione che la include.Each header is indented under the header that includes it.

Errori relativi alle funzioni CRTErrors involving CRT functions

Nel corso degli anni sono state apportate numerose modifiche al runtime C.Many changes have been made to the C runtime over the years. Sono state aggiunte molte versioni sicure delle funzioni e alcune sono state rimosse.Many secure versions of functions have been added, and some have been removed. Come già descritto in precedenza in questo articolo, l'implementazione Microsoft della libreria CRT è stata sottoposta a refactoring in Visual Studio 2015, con nuovi file binari e file .lib associati.Also, as described earlier in this article, Microsoft’s implementation of the CRT was refactored in Visual Studio 2015 into new binaries and associated .lib files.

Se un errore riguarda una funzione CRT, cercare altre informazioni in Cronologia delle modifiche di Visual C++ dal 2003 al 2015 o in Miglioramenti della conformità di C++ in Visual Studio 2017.If an error involves a CRT function, search the Visual C++ change history 2003 - 2015 or C++ conformance improvements in Visual Studio 2017 to see if those topics contain any additional information. Se l'errore è LNK2019, simbolo esterno non risolto, assicurarsi che la funzione non sia stata rimossa.If the error is LNK2019, unresolved external, make sure the function has not been removed. In alternativa, se si è certi che la funzione esiste ancora e che il codice chiamante è corretto, verificare se il progetto usa /NODEFAULTLIB.Otherwise, if you are sure that the function still exists, and the calling code is correct, check to see whether your project uses /NODEFAULTLIB. In tal caso è necessario aggiornare l'elenco delle librerie, in modo che il progetto usi le nuove librerie universali (UCRT).If so you need to update the list of libraries so that the project uses the new universal (UCRT) libraries. Per altre informazioni, vedere la sezione precedente relativa alla libreria e alle dipendenze.See the section above on Library and dependencies for more information.

Se l'errore riguarda printf o scanf, assicurarsi che nessuna delle due funzioni sia definita privatamente senza l'inclusione di stdio.h.If the error involves printf or scanf, make sure that you are not privately defining either function without including stdio.h. Se così fosse, rimuovere le definizioni private o definire il collegamento con legacy_stdio_definitions.lib (Progetto | Proprietà | Linker | Classe di input del linker).If so, either remove the private definitions or link to legacy_stdio_definitions.lib (Project | Properties | Linker | Linker Input). Se esegue il collegamento con Windows SDK 8.1 o versione precedente, aggiungere legacy_stdio_definitions.lib.If you are linking with Windows SDK 8.1 or earlier, then add legacy_stdio_definitions.lib.

Se l'errore riguarda argomenti della stringa di formato, è probabile che il compilatore applichi lo standard in modo più restrittivo.If the error involves format string arguments, this is probably because the compiler is stricter about enforcing the standard. Per altre informazioni vedere la cronologia delle modifiche.See the change history for more information. Prestare particolare attenzione a eventuali errori in questa fase, in quanto possono rappresentare rischi per la sicurezza.Please pay close attention to any errors here because they can potentially represent a security risk.

Errori dovuti a modifiche dello standard C++Errors due to changes in the C++ standard

Anche lo standard C++ è stato sottoposto ad aggiornamenti non sempre compatibili con le versioni precedenti.The C++ standard itself has evolved in ways that are not always backward compatible. L'introduzione della semantica di spostamento, di nuove parole chiave e di altre funzionalità del linguaggio e della libreria standard in C++ 11 può causare errori del compilatore e anche un comportamento diverso in fase di runtime.The introduction in C++11 of move semantics, new keywords, and other language and standard library features can potentially cause compiler errors and even different runtime behavior.

Ad esempio, un vecchio programma C++ può includere l'intestazione iostream.h.For example, an old C++ program might include the iostream.h header. Questa intestazione è stata deprecata nelle fasi iniziali della storia di C++ e alla fine è stata completamente rimossa da Visual C++.This header was deprecated early in the history of C++ and was eventually removed completely from Visual C++. In questo caso sarà necessario usare <iostream> e riscrivere il codice.In this case, you will need to use <iostream> and rewrite your code. Per altre informazioni, vedere Aggiornamento del vecchio codice iostream.For more information, see Updating old iostreams code.

C4838: avviso di conversione verso un tipo di dati più piccoloC4838: narrowing conversion warning

Ora lo standard C++ specifica che le conversioni da valori integrali senza segno a valori integrali con segno sono considerate come conversioni verso un tipo di dati più piccolo.The C++ standard now specifies that conversions from unsigned to signed integral values are considered as narrowing conversions. Il compilatore Visual C++ non generava questo avviso prima di Visual Studio 2015.The Visual C++ compiler did not raise this warning prior to Visual Studio 2015. Controllare ogni ricorrenza per assicurarsi che la conversione verso un tipo di dati più piccolo non introduca errori nel codice.You should inspect each occurrence to make sure the narrowing does not impact the correctness of your code.

Avvisi per l'uso di funzioni CRT protetteWarnings to use secure CRT functions

Nel corso degli anni sono state introdotte versioni sicure delle funzioni runtime C.Over the years, secure versions of C runtime functions have been introduced. Le versioni precedenti e non sicure sono ancora disponibili, ma è consigliabile modificare il codice per usare le versioni sicure.Although the old, non-secure versions are still available, it is recommended to change your code to use the secure versions. Il compilatore genererà un avviso se si usano versioni non sicure.The compiler will issue a warning for usage of the non-secure versions. È possibile scegliere di disabilitare o ignorare questi avvisi.You can choose to disable or ignore these warnings. Per disabilitare l'avviso per tutti i progetti nella soluzione, aprire Visualizza | Gestione proprietà, selezionare tutti i progetti per i quali disabilitare l'avviso, quindi fare clic con il pulsante destro del mouse sugli elementi selezionati e scegliere Proprietà | C/C++ | Avanzate | Disabilita avvisi specifici.To disable the warning for all projects in your solution, open View | Property Manager, select all projects for which you want to disable the warning, then right-click on the selected items and choose Properties | C/C++ | Advanced | Disable Specific Warnings. Fare clic sulla freccia a discesa e quindi su Modifica.Click the drop-down arrow and then click on Edit. Immettere 4996 nella casella di testo.Enter 4996 into the text box. (Non includere il prefisso "C".) Per altre informazioni, vedere Porting per l'uso di funzioni CRT sicure.(Don't include the 'C' prefix.) For more information, see Porting to use the Secure CRT.

Errori dovuti a modifiche alle API di Windows o a SDK obsoletiErrors due to changes in Windows APIs or obsolete SDKs

Nel corso degli anni sono stati aggiunti (e talvolta modificati o rimossi) tipi di dati e API di Windows.Over the years, Windows APIs and data types have been added, and sometimes changed or removed. Sono stati anche aggiunti e rimossi altri SDK non appartenenti al sistema operativo principale.Also, other SDKs that did not belong to the core operating system have come and gone. È perciò possibile che i programmi meno recenti contengano chiamate ad API che non esistono più.Older programs may therefore contain calls to APIs that no longer exist. Possono anche contenere chiamate ad API di altri SDK Microsoft che non sono più supportati.They may also contain calls to APIs in other Microsoft SDKs that are no longer supported. Se viene visualizzato un errore relativo a un'API di Windows o a un'API di un SDK Microsoft meno recente, è possibile che un'API sia stata rimossa e/o sostituita da una funzione più recente e sicura.If you see an error involving a Windows API or an API from an older Microsoft SDK, it is possible that an API has been removed and/or superseded by a newer, more secure function.

Per altre informazioni sul set di API corrente e sul sistema operativo minimo supportato da un'API specifica di Windows, vedere Windows API Index (Indice delle API di Windows) e passare all'API in questione.For more information about the current API set and the minimum supported operating systems for a specific Windows API, see Windows API Index and navigate to the API in question.

Versione di WindowsWindows version

Quando si aggiorna un programma che usa direttamente o indirettamente l'API di Windows, è necessario scegliere la versione minima di Windows da supportare.When upgrading a program that uses the Windows API either directly or indirectly, you will need to decide the minimum Windows version to support. Nella maggior parte dei casi Windows 7 è una scelta ottimale.In most cases Windows 7 is a good choice. Per altre informazioni, vedere Problemi del file di intestazione.For more information see Header file problems. La macro WINVER definisce la versione più vecchia di Windows nella quale è possibile eseguire il programma.The WINVER macro defines the oldest version of Windows that your program is designed to run on. Se il programma MFC imposta WINVER su 0x0501 (Windows XP) verrà visualizzato un avviso, perché MFC non supporta più XP anche se il compilatore dispone di una modalità XP.If your MFC program sets WINVER to 0x0501 (Windows XP) you will get a warning because MFC no longer supports XP, even though the compiler itself has an XP mode.

Per altre informazioni, vedere Aggiornamento della versione di Windows di destinazione e Altri file di intestazione obsoleti.For more information, see Updating the Target Windows Version and More outdated header files.

ATL/MFCATL / MFC

ATL e MFC sono API relativamente stabili, ma anch'esse vengono modificate occasionalmente.ATL and MFC are relatively stable APIs but changes are made occasionally. Per altre informazioni, vedere Cronologia delle modifiche di Visual C++ dal 2003 al 2015, Novità di Visual C++ in Visual Studio 2017 e Miglioramenti della conformità di Visual C++ in Visual Studio 2017.See the Visual C++ change history 2003 - 2015 for more information and What's New for Visual C++ in Visual Studio 2017 and C++ conformance improvements in Visual Studio 2017.

LNK 2005 _DllMain@12 già definito in MSVCRTD.libLNK 2005 _DllMain@12 already defined in MSVCRTD.lib

Questo errore può verificarsi nelle applicazioni MFC.This error can occur in MFC applications. Indica un problema di ordinamento tra la libreria CRT e la libreria MFC.It indicates an ordering issue between the CRT library and the MFC library. La libreria MFC deve essere collegata per prima, in modo che renda disponibili gli operatori new e delete.MFC needs to be linked first so that it provides new and delete operators. Per correggere l'errore, usare l'opzione /NODEFAULTLIB per ignorare le librerie predefinite MSVCRTD.lib e mfcs140d.lib.To fix the error, use the /NODEFAULTLIB switch to Ignore these default libraries: MSVCRTD.lib and mfcs140d.lib. Quindi aggiungere queste librerie come dipendenze aggiuntive.Then add these same libs as additional dependencies.

32 bit e 64 bit32 vs 64 bit

Se il codice originale viene compilato per sistemi a 32 bit, è possibile scegliere di creare una versione a 64 bit in sostituzione o in aggiunta a una nuova applicazione a 32 bit.If your original code is compiled for 32-bit systems, you have the option of creating a 64-bit version instead of or in addition to a new 32-bit app. In genere è consigliabile completare la compilazione del programma in modalità a 32 bit, quindi provare a eseguire la compilazione a 64 bit.In general, you should get your program compiling in 32-bit mode first, and then attempt 64-bit. La compilazione in modalità a 64 bit è semplice, ma in alcuni casi evidenzia bug che non apparivano nelle build a 32 bit.Compiling for 64-bit is straightforward, but in some cases it can reveal bugs that were hidden by 32-bit builds.

È anche necessario tenere presenti possibili problemi in fase di compilazione e runtime relativi a dimensioni del puntatore, valori di ora e dimensioni e identificatori di formato nelle funzioni printf e scanf.Also, you should be aware of possible compile-time and runtime issues relating to pointer size, time and size values, and format specifiers in printf and scanf functions. Per altre informazioni, vedere Configurare Visual C++ per destinazioni x64 a 64 bit e Problemi comuni relativi alla migrazione di Visual C++ a 64 bit.For more information, see Configure Visual C++ for 64-bit, x64 targets and Common Visual C++ 64-bit Migration Issues. Per altri suggerimenti relativi alla migrazione, vedere Guida alla programmazione per Windows a 64 bit.For additional migration tips, see Programming Guide for 64-bit Windows.

Unicode e MBCS/ASCIIUnicode vs MBCS/ASCII

Prima dell'introduzione dello standard Unicode, molti programmi usavano set di caratteri multibyte (MBCS) per rappresentare i caratteri non inclusi nel set di caratteri ASCII.Before Unicode was standardized, many programs used the Multibyte Character Set (MBCS) to represent characters that were not included in the ASCII character set. Nei vecchi progetti MFC, MBCS era l'impostazione predefinita. Quando si aggiorna un programma di questo tipo vengono visualizzati avvisi che consigliano di usare Unicode.In older MFC projects, MBCS was the default setting, and when you upgrade such a program, you will see warnings that advise to use Unicode instead. È possibile scegliere di disabilitare o ignorare l'avviso se si decide che la conversione a Unicode comporta costi di sviluppo eccessivi.You may choose to disable or ignore the warning if you decide that converting to Unicode is not worth the development cost. Per disabilitare l'avviso per tutti i progetti nella soluzione, aprire Visualizza | Gestione proprietà, selezionare tutti i progetti per i quali disabilitare l'avviso, quindi fare clic con il pulsante destro del mouse sugli elementi selezionati e scegliere Proprietà | C/C++ | Avanzate | Disabilita avvisi specifici.To disable it for all projects in your solution, open View | Property Manager, select all projects for which you want to disable the warning, then right-click on the selected items and choose Properties | C/C++ | Advanced | Disable Specific Warnings. Fare clic sulla freccia a discesa e quindi su Modifica.Click the drop-down arrow and then click on Edit. Immettere 4996 nella casella di testo.Enter 4996 into the text box. (Non includere il prefisso "C".)(Don't include the 'C' prefix.)

Per altre informazioni, vedere Porting da MBCS a Unicode.For more information, see Porting from MBCS to Unicode. Per informazioni generali su MBCS e Unicode, vedere Testo e stringhe in Visual C++ e Internazionalizzazione .For general information about MBCS vs. Unicode, see Text and Strings in Visual C++ and Internationalization .

Vedere ancheSee Also

Aggiornamento di progetti da versioni precedenti di Visual C++ Miglioramenti della conformità di C++ in Visual Studio 2017Upgrading Projects from Earlier Versions of Visual C++ C++ conformance improvements in Visual Studio 2017