Domande frequenti sulla libreria C++ Standard

Questo articolo fornisce un elenco di domande frequenti sulle librerie C++ standard e le risposte a tali domande.

Versione originale del prodotto: Visual C++
Numero KB originale: 154419

Contenuto della libreria C++ standard

La libreria C++ standard fornisce un framework estendibile e contiene componenti per il supporto del linguaggio, la diagnostica, le utilità generali, le stringhe, le impostazioni locali, la libreria di modelli standard (contenitori, iteratori, algoritmi e numeri) e l'input/output.

La libreria C++ standard può essere suddivisa nelle categorie seguenti:

  1. I componenti STL (Standard Template Library) forniscono un programma C++ con accesso a un subset degli algoritmi e delle strutture di dati più usati. Le intestazioni STL possono essere raggruppate in tre principali concetti organizzativi:

    • Contenitori: classi di modelli che supportano modi comuni per organizzare i dati, ad vectoresempio , list, deque, stack, queue, sete map.

    • Algoritmi: funzioni modello per l'esecuzione di operazioni comuni su sequenze di oggetti, ad esempio funzionali, algoritmi e numerici.

    • Iteratori: l'associazione che incolla algoritmi e contenitori insieme, ad esempio utilità, iteratore e memoria.

  2. Input/Output include componenti per le dichiarazioni forward di iostreams (iosfwd), gli oggetti predefiniti iostreams (iostream), le classi di base iostreams (ios), il buffering del flusso (streambuf), la formattazione del flusso e i manipolatori (iosmanip, , istream), ostreami flussi stringa (sstream) e i flussi di file (fstream).

  3. Altre intestazioni C++ standard includono:

    • Supporto del linguaggio: componenti per definizioni di tipi comuni usate nella libreria (cstddef), caratteristiche dei tipi predefiniti (limits, cfloat, ), climitsfunzioni che supportano l'avvio e la terminazione di un programma C++,cstdlib supporto per la gestione dinamica della memoria (new), supporto per l'identificazione dinamica dei tipi (typeinfo), supporto per l'elaborazione delle eccezioni (exception) e altro supporto di runtime (cstdarg, ctime, csetlmp, csignal).

    • Diagnostica: componenti per la segnalazione di diversi tipi di condizioni eccezionali (stdexcept), la documentazione delle asserzioni del programma (cassert ) e una variabile globale per i codici di numero di errore (cerrno).

    • Stringhe: componenti per le classi stringa (string) e le utilità di sequenza con terminazione Null (cctype, cwctype, cwchar).

    • Localizzazione: componenti che i programmi C++ possono usare per incapsulare le differenze culturali. La funzionalità delle impostazioni locali include il supporto dell'internazionalizzazione per la classificazione dei caratteri e le regole di confronto delle stringhe, la formattazione e l'analisi numerica, monetaria e data/ora e il recupero dei messaggi (locale, clocale).

Qual è la differenza tra CRT e la libreria C++ standard? Quali librerie includeranno le opzioni del compilatore della libreria di runtime

Visual C++ include le librerie seguenti oltre alle librerie MFC (Microsoft Foundation Classes):

  • Libreria C-Runtime di base
  • Libreria C++ standard
Tipi di libreria e opzioni del compilatore correlate Libreria di runtime C di base/libreria C++ standard
Thread singolo (/ML) LIBC. LIB/LIBCP. LIB
Eseguire il debug a thread singolo (/MLd) LIBCD. LIB/LIBCPD. LIB
Multithreading (/MT) LIBCMT. LIB/LIBCPMT. LIB
Debug multithreading (/MTd) LIBCMTD. LIB/LIBCPMTD. LIB
DLL multithreading (/MD) MSVCRT. LIB/MSVCPRT. LIB
Eseguire il debug di /DLL multithreading (MDd) MSVCRTD. LIB/MSVCPRTD. LIB

Nota

  • Le opzioni del compilatore della libreria /ML e /MLd per le librerie a thread singolo in modo statico sono state rimosse in Visual C++.
  • MSVCPRT.lib e MSVCPRTD.lib sono librerie statiche e non hanno librerie a collegamento dinamico (DLL) direttamente correlate. Queste librerie dipendono anche da MSVCRT.lib e MSVCRTD.lib, rispettivamente. Se sono presenti applicazioni che usano MSVCPRT.lib o MSVCPRTD.lib e si usa l'opzione Ignora libreria predefinita (/NOD o NODEFAULTLIB), assicurarsi di collegare MSVCPRT.lib (o MSVCPRTD.lib) e MSVCRT.lib (o MSVCRTD.lib) con l'applicazione. In caso contrario, si otterranno errori del linker (LNK2001: esterni non risolti in MSVCPRT.lib o MSVCPRTD.lib) durante il collegamento dell'applicazione. A seconda delle intestazioni usate nel codice, è possibile collegare anche una libreria della libreria C++ standard.

Il file di intestazione use_ansi.h contiene #pragma istruzioni che forzano il collegamento della libreria C++ standard. Tutte le intestazioni C++ standard includono use_ansi.h: se si include un'intestazione C++ Standard nell'applicazione, la libreria C++ Standard verrà collegata per impostazione predefinita.

Intestazioni C++ standard

Colonna 1 Colonna 2 Colonna 3 Colonna 4
ALGORITMO BITSET COMPLESSO DEQUE
ECCEZIONE FSTREAM FUNZIONALE IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
ITERATORE LIMITI ELENCO IMPOSTAZIONI INTERNAZIONALI
MAPPA MEMORIA NUMERICO OSTREAM
CODA IMPOSTARE SSTREAM PILA
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO UTILITÀ VALARRAY VETTORE

Come mantenere la funzionalità "iostream" precedente da Visual C++ .NET 2003 o versioni precedenti se il progetto viene convertito da una versione precedente

Se si vuole mantenere la libreria precedente iostream (iostream.h), includere uno o più file di intestazione precedenti iostream nel codice. Non usare le nuove intestazioni C++ Standard. Non è possibile combinare le chiamate alla libreria precedente iostream e alla nuova libreria C++ standard.

Come rendere le librerie C++ standard le librerie predefinite per l'applicazione

Se si vuole impostare le librerie C++ standard come predefinite, includere una o più delle nuove intestazioni C++ standard. Non è possibile combinare le chiamate alla libreria C++ standard precedente iostream e nuova. Le librerie esistenti (collegamento statico o dinamico) che usano funzioni precedenti iostream dovranno essere modificate per usare le funzioni di libreria iostream C++ standard.

Se si usano librerie C++ standard nelle applicazioni MFC, si verificheranno conflitti con le librerie C-Runtime

No. Microsoft Foundation Classes (MFC) non usa alcuna funzione C-Runtime in conflitto con le librerie C++ standard.

Perché viene visualizzato l'errore (errore C2065: ''cout'': identificatore non dichiarato) anche se sono stato incluso "iostream"

La libreria C++ standard viene implementata nel proprio spazio dei nomi std. Assicurarsi di aggiungere l'istruzione seguente all'inizio del programma:

using namespace std;

In alternativa, qualificare ogni identificatore di libreria C++ standard con lo spazio dei nomi std, std::coutad esempio .

Perché viene visualizzato un errore (errore del compilatore C2371: ridefinizione dell'identificatore; tipi di base diversi)

Nelle versioni di Visual C++ precedenti a Visual C++ 2005, la combinazione di intestazioni C++ standard e intestazioni precedenti iostream causa questo errore, anche se sono incluse in file di origine diversi. Di seguito sono riportate le diverse intestazioni:

  • Intestazioni precedenti iostream :

    Colonna 1 Colonna 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • Intestazioni C++ standard:

    Colonna 1 Colonna 2 Colonna 3 Colonna 4
    ALGORITMO BITSET COMPLESSO DEQUE
    ECCEZIONE FSTREAM FUNZIONALE IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    ITERATORE LIMITI ELENCO IMPOSTAZIONI INTERNAZIONALI
    MAPPA MEMORIA NUMERICO OSTREAM
    CODA IMPOSTARE SSTREAM PILA
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO UTILITÀ VALARRAY VETTORE

Perché viene visualizzato un messaggio (LNK2001: il simbolo esterno non risolto 'symbol';) nelle chiamate di funzione 'iostream' quando il progetto viene compilato con Ignora librerie predefinite

Le iostream funzioni sono state rimosse dalla libreria C-Runtime.

Se si usano le funzioni precedenti iostream , è necessario aggiungere un'altra libreria LIBCI.lib ( ML a thread singolo), LIBCIMT.lib ( MT multithreading) o MSVCIRT.lib ( MD dll multithreading). Queste librerie sono state rimosse da Visual C++.

Se si usano le nuove iostream funzioni incluse nella libreria C++ Standard, è necessario aggiungere un'altra libreria LIBCP.lib ( ML a thread singolo), LIBCPMT.lib ( MT multithreading) o MSVCPRT.lib ( MD dll multithreading).

Non combinare versioni diverse delle librerie. Ad esempio, se si usa la versione a thread singolo della libreria C-Runtime, è necessario usare anche la versione a thread singolo della libreria precedente iostream o della libreria C++ standard.

Non è possibile combinare le chiamate alle funzioni di libreria precedenti iostream e alle nuove funzioni della libreria iostream C++ standard.

Perché si ricevono avvisi del compilatore C4786 o C4788? Nessuno dei simboli nel mio programma è quasi 255 caratteri di lunghezza

C4786 o C4788 viene emesso quando il nome di un simbolo supera i 255 caratteri di lunghezza. Questo problema si verifica spesso con la classe modello e STL usa ampiamente la classe modello.

Ignorare questo avviso è sicuro. Usare un #pragma avviso (disabilita: 4786.4788) per eliminare i messaggi.

Perché viene visualizzato il messaggio (C4530: usato il gestore eccezioni C++, ma la semantica di rimozione non è abilitata. Specificare -GX)

I programmi che usano la libreria C++ standard devono essere compilati con la gestione delle eccezioni C++ abilitata. La gestione delle eccezioni C++ può essere abilitata con uno dei metodi seguenti:

  • Selezionare l'opzione Abilita gestione eccezioni nella categoria di linguaggio C++ della scheda C/C++ nella finestra di dialogo Impostazioni progetto .
  • Uso dell'opzione del compilatore /GX .

Perché viene visualizzato l'errore del compilatore C2146, seguito da C2065 e infine C2143, che punta alla stessa riga nell'origine

Questa sequenza di errori può essere causata dal tipo di costrutto seguente:

vector<int, allocator<int>>iV;

Il problema è causato dall'oggetto consecutivo >> alla fine della dichiarazione. La soluzione consiste nell'inserire uno spazio tra due caratteri, in modo che il costrutto diventi:

vector<int, allocator<int> > iV;

È coerente con la specifica ANSII proposta.