Dit artikel bevat een lijst met veelgestelde vragen (FAQ's) over de Standard C++-bibliotheken en de antwoorden op deze vragen.
Oorspronkelijke productversie: Visual C++
Origineel KB-nummer: 154419
Wat bevat de Standard C++-bibliotheek?
De Standard C++-bibliotheek biedt een uitbreidbaar framework en bevat onderdelen voor taalondersteuning, diagnostische gegevens, algemene hulpprogramma's, tekenreeksen, landinstellingen, standaardsjabloonbibliotheek (containers, iterators, algoritmen en numerieke gegevens) en invoer/uitvoer.
De Standard C++-bibliotheek kan worden onderverdeeld in de volgende categorieën:
Stl-onderdelen (Standard Template Library) bieden een C++-programma met toegang tot een subset van de meest gebruikte algoritmen en gegevensstructuren. STL-headers kunnen worden gegroepeerd in drie belangrijke organiserende concepten:
Containers: sjabloonklassen die algemene manieren ondersteunen om gegevens te organiseren, zoals
vector,list,deque,stack,queue, ,setenmap.Algoritmen: sjabloonfuncties voor het uitvoeren van algemene bewerkingen op reeksen van objecten, zoals functioneel, algoritme en numeriek.
Iterators: de lijm die algoritmen en containers samen plakt, zoals hulpprogramma, iterator en geheugen.
Invoer/uitvoer bevat onderdelen voor doorsturende declaraties van
iostreams(iosfwd), vooraf gedefinieerdeiostreamsobjecten (iostream), basisklasseniostreams(ios), stroombuffering (streambuf), stroomopmaak en manipulators (iosmanip,istream,ostream), tekenreeksstromen (sstream) en bestandsstromen (fstream).Andere Standard C++-headers zijn:
Taalondersteuning: onderdelen voor veelgebruikte typedefinities die in de bibliotheek worden gebruikt (
cstddef), kenmerken van de vooraf gedefinieerde typen (limits,cfloat,climits), functies die het starten en beëindigen van een C++-programma ondersteunen (cstdlib), ondersteuning voor dynamisch geheugenbeheer (new), ondersteuning voor dynamische typeidentificatie (typeinfo), ondersteuning voor de verwerking van uitzonderingen (exception), en andere runtime-ondersteuning (cstdarg,ctime,csetlmp, ).csignalDiagnostische gegevens: onderdelen voor het rapporteren van verschillende soorten uitzonderlijke omstandigheden (
stdexcept), het documenteren van programma-asserties (cassert) en een globale variabele voor foutcodecodes (cerrno).Tekenreeksen: onderdelen voor tekenreeksklassen (
string) en null-beëindigde reekshulpprogramma's (cctype,cwctype,cwchar).Lokalisatie: onderdelen die C++-programma's kunnen gebruiken om culturele verschillen in te kapselen. De landinstellingsfaciliteit omvat internationaliseringsondersteuning voor tekenclassificatie en tekenreekssortering, numerieke, monetaire en datum/tijd-opmaak en parsering en het ophalen van berichten (
locale,clocale).
Wat is het verschil tussen DE CRT- en Standard C++-bibliotheek? Welke bibliotheken bevatten de compileropties voor runtime-bibliotheken
Visual C++ bevat naast de MFC-bibliotheken (Microsoft Foundation Classes) de volgende bibliotheken:
- Basic C-Runtime-bibliotheek
- Standard C++-bibliotheek
| Bibliotheektypen en gerelateerde compilerswitches | Basic C Runtime-bibliotheek/Standard C++-bibliotheek |
|---|---|
| Met één thread (/ML) | LIBC. LIB/ LIBCP. LIB |
| Fouten opsporen met één thread (/MLd) | LIBCD. LIB/ LIBCPD. LIB |
| Multithreaded (/MT) | LIBCMT. LIB / LIBCPMT. LIB |
| Fouten opsporen in multithreaded (/MTd) | LIBCMTD. LIB / LIBCPMTD. LIB |
| Multithreaded DLL (/MD) | MSVCRT. LIB/ MSVCPRT. LIB |
Fouten opsporen in multithreaded/DLL (MDd) |
MSVCRTD. LIB / MSVCPRTD. LIB |
Opmerking
- De /ML - en /MLd-bibliotheekcomppilatieopties voor statische bibliotheken met één thread zijn verwijderd in Visual C++.
- MSVCPRT.lib en MSVCPRTD.lib zijn statische bibliotheken en hebben geen DLL's (Dynamic Link Libraries) die er rechtstreeks aan zijn gerelateerd. Deze bibliotheken zijn ook afhankelijk van respectievelijk MSVCRT.lib en MSVCRTD.lib. Als u toepassingen hebt die gebruikmaken van MSVCPRT.lib of MSVCPRTD.lib en u de optie Standaardbibliotheek negeren (/NOD of NODEFAULTLIB) gebruikt, moet u MSVCPRT.lib (of MSVCPRTD.lib) en MSVCRT.lib (of MSVCRTD.lib) koppelen aan uw toepassing. Anders krijgt u linkerfouten (LNK2001: onopgeloste externen in MSVCPRT.lib of MSVCPRTD.lib) bij het koppelen van uw toepassing. Afhankelijk van de kopteksten die u in uw code gebruikt, kan ook een bibliotheek uit de Standard C++-bibliotheek worden gekoppeld.
Het headerbestand use_ansi.h bevat #pragma instructies waarmee de Standard C++-bibliotheek wordt gekoppeld. Alle Standard C++-headers bevatten use_ansi.h: als u een Standard C++-header in uw toepassing opneemt, wordt de Standard C++-bibliotheek standaard gekoppeld.
Standaard C++-headers
| Kolom 1 | Kolom 2 | Kolom 3 | Kolom 4 |
|---|---|---|---|
| ALGORITME | BITSET | COMPLEXE | DEQUE |
| UITZONDERING | FSTREAM | FUNCTIONELE | IOMANIP |
| IOS | IOSFWD | IOSTREAM | ISTREAM |
| ITERATOR | GRENZEN | LIJST | LOCALE |
| KAART | GEHEUGEN | NUMERIEKE | OSTREAM |
| WACHTRIJ | SET | SSTREAM | STACK |
| STDEXCEPT | STREAMBUF | TEKENREEKS | STRSTREAM |
| TYPEINFO | UTILITY | VALARRAY | VECTOR |
Oude iostream-functionaliteit van Visual C++ .NET 2003 of eerdere versies behouden als ik mijn project van een eerdere versie overneem
Als u de oude iostream bibliotheek (iostream.h) wilt behouden, neemt u een of meer van de oude iostream headerbestanden op in uw code. Gebruik niet de nieuwe Standard C++-headers. U kunt aanroepen naar de oude iostream bibliotheek en de nieuwe Standard C++-bibliotheek niet combineren.
Standard C++-bibliotheken de standaardbibliotheken maken voor mijn toepassing
Als u de Standaard C++-bibliotheken standaard wilt maken, neemt u een of meer van de nieuwe Standard C++-headers op. U kunt aanroepen niet combineren met de oude iostream en de nieuwe Standard C++-bibliotheek. Bestaande bibliotheken (statische of dynamische koppeling) die gebruikmaken van oude iostream functies, moeten worden gewijzigd voor het gebruik van Standard C++-bibliotheekfuncties iostream .
Als ik Standard C++-bibliotheken in MFC-toepassingen gebruik, veroorzaakt dit conflicten met C-Runtime-bibliotheken
Nee. Microsoft Foundation Classes (MFC) maakt geen gebruik van C-Runtime-functies die een conflict veroorzaken met de Standard C++-bibliotheken.
Waarom krijg ik een fout (fout C2065: ''cout'' : niet-aangegeven id) ook al heb ik 'iostream' opgenomen
Standaard C++-bibliotheek wordt geïmplementeerd in de eigen naamruimte std. Zorg ervoor dat u de volgende instructie aan het begin van uw programma toevoegt:
using namespace std;
Of kwalificeer elke Standard C++-bibliotheek-id met naamruimte std, std::coutbijvoorbeeld .
Waarom ik een fout krijg (compilerfout C2371: 'id'-herdefinitie; verschillende basistypen)
In versies van Visual C++ die ouder zijn dan Visual C++ 2005, veroorzaakt het combineren van Standard C++-headers en oude iostream headers deze fout, zelfs als ze zijn opgenomen in verschillende bronbestanden. Hier volgen de verschillende headers:
Oude
iostreamheaders:Kolom 1 Kolom 2 FSTREAM. H IOMANIP. H IOS. H IOSTREAM. H ISTREAM. H OSTREAM. H STDIOSTR. H STREAMB. H STRSTREA. H Standaard C++-headers:
Kolom 1 Kolom 2 Kolom 3 Kolom 4 ALGORITME BITSET COMPLEXE DEQUE UITZONDERING FSTREAM FUNCTIONELE IOMANIP IOS IOSFWD IOSTREAM ISTREAM ITERATOR GRENZEN LIJST LOCALE KAART GEHEUGEN NUMERIEKE OSTREAM WACHTRIJ SET SSTREAM STACK STDEXCEPT STREAMBUF TEKENREEKS STRSTREAM TYPEINFO UTILITY VALARRAY VECTOR
Waarom ik een bericht ontvang (LNK2001: onopgeloste extern symbool 'symbool' ;) op 'iostream'-functieaanroepen wanneer het project is gebouwd met Standaardbibliotheken negeren
De iostream functies zijn verwijderd uit de C-Runtime-bibliotheek.
Als u de oude iostream functies gebruikt, moet u een andere bibliotheek LIBCI.lib ( ML met één thread), LIBCIMT.lib (multithreaded MT) of MSVCIRT.lib (multithreaded dll MD) toevoegen. Deze bibliotheken zijn verwijderd uit Visual C++.
Als u de nieuwe iostream functies gebruikt die zijn opgenomen in de Standard C++-bibliotheek, moet u een andere bibliotheek LIBCP.lib ( ML met één thread), LIBCPMT.lib (multithreaded MT) of MSVCPRT.lib (multithreaded dll MD) toevoegen.
Gebruik geen verschillende versies van de bibliotheken. Als u bijvoorbeeld de versie met één thread van de C-Runtime-bibliotheek gebruikt, moet u ook de versie met één thread van de oude iostream bibliotheek of Standard C++-bibliotheek gebruiken.
U kunt aanroepen niet combineren met de oude iostream bibliotheekfuncties en de nieuwe Standard C++-bibliotheekfuncties iostream .
Waarom krijg ik compilerwaarschuwingen C4786 of C4788? Geen van de symbolen in mijn programma is ergens in de buurt van 255 tekens lang
C4786 of C4788 wordt uitgegeven wanneer de naam van een symbool langer is dan 255 tekens. Dit probleem treedt vaak op met sjabloonklasse en STL maakt veel gebruik van sjabloonklasse.
Het negeren van deze waarschuwing is veilig. Gebruik een #pragma waarschuwing (uitschakelen: 4786,4788) om de berichten te onderdrukken.
Waarom ik het bericht krijg (C4530: C++-uitzonderingshandler gebruikt, maar semantiek voor ontspanning is niet ingeschakeld. -GX opgeven)
Programma's die gebruikmaken van de Standard C++-bibliotheek moeten worden gecompileerd met C++-uitzonderingsafhandeling ingeschakeld. De afhandeling van C++-uitzonderingen kan op een van de volgende manieren worden ingeschakeld:
- Selecteer de optie Uitzonderingsafhandeling inschakelen in de C++-taalcategorie van het tabblad C/C++ in het dialoogvenster Projectinstellingen .
- Met behulp van de /GX compiler switch.
Waarom ik de compilerfout C2146 krijg, gevolgd door C2065 en ten slotte C2143, die allemaal verwijzen naar dezelfde regel in mijn bron
Deze reeks fouten kan worden veroorzaakt door het volgende type constructie:
vector<int, allocator<int>>iV;
Het probleem wordt veroorzaakt door de opeenvolgende >> aan het einde van de declaratie. De oplossing is om een spatie tussen twee tekens te plaatsen, zodat de constructie wordt:
vector<int, allocator<int> > iV;
Het is consistent met de voorgestelde ANSII-specificatie.