Dieser Artikel enthält eine Liste häufig gestellter Fragen (FAQs) zu den C++-Standardbibliotheken und antworten auf diese Fragen.
Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 154419
Was enthält die C++-Standardbibliothek?
Die C++-Standardbibliothek stellt ein erweiterbares Framework bereit und enthält Komponenten für sprachunterstützung, Diagnose, allgemeine Hilfsprogramme, Zeichenfolgen, Gebietsschemas, Standardvorlagenbibliothek (Container, Iteratoren, Algorithmen und numerische Elemente) und Eingabe/Ausgabe.
Die C++-Standardbibliothek kann in die folgenden Kategorien unterteilt werden:
STL-Komponenten (Standard Template Library) bieten einem C++-Programm Zugriff auf eine Teilmenge der am häufigsten verwendeten Algorithmen und Datenstrukturen. STL-Header können in drei Hauptorganisationskonzepte gruppiert werden:
Container: Vorlagenklassen, die gängige Methoden zum Organisieren von Daten unterstützen, z
vector
. B. ,list
,deque
,stack
,queue
set
undmap
.Algorithmen: Vorlagenfunktionen zum Ausführen allgemeiner Vorgänge für Sequenzen von Objekten, z. B. funktionale, Algorithmus und numerische.
Iteratoren: Der Klebstoff, der Algorithmen und Container zusammenfügt, z. B. Hilfsprogramm, Iterator und Arbeitsspeicher.
Input/Output umfasst Komponenten für Vorwärtsdeklarationen von
iostreams
(iosfwd
), vordefinierteniostreams
Objekten (iostream
), Basisklasseniostreams
(ios
), Streampufferung (streambuf
), Streamformatierung und Manipulatoren (iosmanip
,istream
,ostream
), Zeichenfolgenstreams (sstream
) und Dateistreams (fstream
).Weitere C++-Standardheader sind:
Sprachunterstützung: Komponenten für allgemeine Typdefinitionen, die in der gesamten Bibliothek verwendet werden (
cstddef
), Merkmale der vordefinierten Typen (limits
,cfloat
,climits
), Funktionen, die das Starten und Beenden eines C++-Programms (cstdlib
), die Unterstützung der dynamischen Speicherverwaltung (new
), die Unterstützung für die dynamische Typidentifikation (typeinfo
), die Unterstützung für die Ausnahmeverarbeitung (exception
) und andere Laufzeitunterstützung (cstdarg
,ctime
,csetlmp
,csignal
) unterstützen.Diagnose: Komponenten zum Melden mehrerer Arten von außergewöhnlichen Bedingungen (
stdexcept
), dokumentierende Programmassertionen (cassert
) und eine globale Variable für Fehlernummerncodes (cerrno
).Zeichenfolgen: Komponenten für Zeichenfolgenklassen (
string
) und MIT NULL endende Sequenzhilfsprogramme (cctype
,cwctype
,cwchar
).Lokalisierung: Komponenten, die von C++-Programmen verwendet werden können, um kulturelle Unterschiede zu kapseln. Die Gebietsschemafunktion umfasst Die Internationalisierungsunterstützung für Die Zeichenklassifizierung und Zeichenfolgensortierung, numerische, monetäre und Datums-/Uhrzeitformatierung und -analyse sowie den Nachrichtenabruf (
locale
,clocale
).
Was ist der Unterschied zwischen CRT und C++-Standardbibliothek? Welche Bibliotheken enthalten laufzeitbibliothekscompiler-Optionen?
Visual C++ enthält neben den MFC-Bibliotheken (Microsoft Foundation Classes) die folgenden Bibliotheken:
- Grundlegende C-Runtime-Bibliothek
- C++-Standardbibliothek
Bibliothekstypen und zugehörige Compileroptionen | C-Runtime-Standardbibliothek/C++-Standardbibliothek |
---|---|
Singlethreading (/ML) | LIBC. LIB/LIBCP. LIB |
Debuggen von Singlethreads (/MLd) | LIBCD. LIB/LIBCPD. LIB |
Multithreaded (/MT) | LIBCMT. LIB/LIBCPMT. LIB |
Debuggen von Multithreaded (/MTd) | LIBCMTD. LIB/LIBCPMTD. LIB |
Multithread-DLL (/MD) | MSVCRT. LIB/MSVCPRT. LIB |
Debuggen von Multithreaded /DLL (MDd ) |
MSVCRTD. LIB/MSVCPRTD. LIB |
Hinweis
- Die Compileroptionen /ML und /MLd für statische Singlethreadbibliotheken wurden in Visual C++ entfernt.
- MSVCPRT.lib und MSVCPRTD.lib sind statische Bibliotheken und haben keine dlLs (Dynamic Link Libraries), die direkt mit ihnen verknüpft sind. Diese Bibliotheken sind auch von MSVCRT.lib bzw . MSVCRTD.lib abhängig. Wenn Sie über Anwendungen verfügen, die MSVCPRT.lib oder MSVCPRTD.lib verwenden und die Option Standardbibliothek ignorieren (/NOD oder NODEFAULTLIB) verwenden, stellen Sie sicher, dass Sie MSVCPRT.lib (oder MSVCPRTD.lib) und MSVCRT.lib (oder MSVCRTD.lib) mit Ihrer Anwendung verknüpfen. Andernfalls erhalten Sie beim Verknüpfen Ihrer Anwendung Linkerfehler (LNK2001: nicht aufgelöste externe Elemente in MSVCPRT.lib oder MSVCPRTD.lib). Abhängig von den Headern, die Sie in Ihrem Code verwenden, kann auch eine Bibliothek aus der C++-Standardbibliothek verknüpft sein.
Die Headerdatei use_ansi.h enthält #pragma
Anweisungen, die erzwingen, dass die C++-Standardbibliothek verknüpft wird. Alle C++-Standardheader enthalten use_ansi.h: Wenn Sie einen C++-Standardheader in Ihre Anwendung einschließen, wird die Standard-C++-Bibliothek standardmäßig verknüpft.
C++-Standardheader
Spalte 1 | Spalte 2 | Spalte 3 | Spalte 4 |
---|---|---|---|
ALGORITHMUS | BITSET | KOMPLEX | DEQUE |
AUSNAHME | FSTREAM | FUNKTIONALE | IOMANIP |
IOS | IOSFWD | IOSTREAM | ISTREAM |
ITERATOR | GRENZEN | LISTE | LOCALE |
KARTE | SPEICHER | NUMERISCHEN | OSTREAM |
QUEUE | FESTGELEGT | SSTREAM | STAPEL |
STDEXCEPT | STREAMBUF | STRING | STRSTREAM |
TYPEINFO | DIENSTPROGRAMM | VALARRAY | VEKTOR |
Beibehalten der alten "iostream"-Funktionalität aus Visual C++ .NET 2003 oder früheren Versionen, wenn ich mein Projekt von einer früheren Version portiere
Wenn Sie die alte iostream
Bibliothek (iostream.h) beibehalten möchten, fügen Sie eine oder mehrere der alten iostream
Headerdateien in Ihren Code ein. Verwenden Sie nicht die neuen Standard-C++-Header. Sie können keine Aufrufe für die alte iostream
Bibliothek und die neue Standard-C++-Bibliothek kombinieren.
Festlegen von C++-Standardbibliotheken als Standardbibliotheken für meine Anwendung
Wenn Sie die Standard-C++-Bibliotheken als Standard festlegen möchten, fügen Sie mindestens einen der neuen Standard-C++-Header ein. Sie können keine Aufrufe für die alte iostream
und die neue Standard-C++-Bibliothek kombinieren. Vorhandene Bibliotheken (statische oder dynamische Verknüpfungen), die alte iostream
Funktionen verwenden, müssen geändert werden, um Standard-C++-Bibliotheksfunktionen iostream
zu verwenden.
Wenn ich C++-Standardbibliotheken in MFC-Anwendungen verwende, führt dies zu Konflikten mit C-Runtime-Bibliotheken?
Nein Microsoft Foundation Classes (MFC) verwendet keine C-Runtime-Funktionen, die mit den C++-Standardbibliotheken in Konflikt stehen.
Warum erhalte ich einen Fehler (Fehler C2065: 'cout'' : nicht deklarierter Bezeichner), obwohl ich "iostream" eingefügt habe
Die C++-Standardbibliothek wird in ihrem eigenen Namespace std
implementiert. Fügen Sie am Anfang Des Programms unbedingt die folgende Anweisung hinzu:
using namespace std;
Oder qualifizieren Sie jeden C++-Standardbibliotheksbezeichner mit dem Namespace std
, std::cout
z. B. .
Warum erhalte ich einen Fehler (Compilerfehler C2371: Neudefinition des Bezeichners; verschiedene Grundlegende Typen)
In Versionen von Visual C++, die älter als Visual C++ 2005 sind, verursacht das Mischen von Standard-C++-Headern und alten iostream
Headern diesen Fehler, auch wenn sie in verschiedenen Quelldateien enthalten sind. Im Folgenden sind die verschiedenen Header aufgeführt:
Alte
iostream
Header:Spalte 1 Spalte 2 FSTREAM. H IOMANIP. H IOS. H IOSTREAM. H ISTREAM. H OSTREAM. H STDIOSTR. H STREAMB. H STRSTREA. H C++-Standardheader:
Spalte 1 Spalte 2 Spalte 3 Spalte 4 ALGORITHMUS BITSET KOMPLEX DEQUE AUSNAHME FSTREAM FUNKTIONALE IOMANIP IOS IOSFWD IOSTREAM ISTREAM ITERATOR GRENZEN LISTE LOCALE KARTE SPEICHER NUMERISCHEN OSTREAM QUEUE FESTGELEGT SSTREAM STAPEL STDEXCEPT STREAMBUF STRING STRSTREAM TYPEINFO DIENSTPROGRAMM VALARRAY VEKTOR
Warum erhalte ich eine Nachricht (LNK2001: nicht aufgelöstes externes Symbol 'Symbol';) bei "iostream"-Funktionsaufrufen, wenn das Projekt mit Standardbibliotheken ignorieren erstellt wird
Die iostream
Funktionen wurden aus der C-Runtime-Bibliothek entfernt.
Wenn Sie die alten iostream
Funktionen verwenden, müssen Sie eine weitere Bibliothek libCI.lib (Singlethreaded ML), LIBCIMT.lib (Multithreaded MT) oder MSVCIRT.lib (Multithreaded DLL MD) hinzufügen. Diese Bibliotheken wurden aus Visual C++ entfernt.
Wenn Sie die neuen iostream
Funktionen verwenden, die in der C++-Standardbibliothek enthalten sind, müssen Sie eine weitere Bibliothek hinzufügen: LIBCP.lib (Singlethread-ML), LIBCPMT.lib (multithreaded MT) oder MSVCPRT.lib (multithreaded DLL MD).
Mischen Sie keine verschiedenen Versionen der Bibliotheken. Wenn Sie z. B. die Singlethreadversion der C-Runtime-Bibliothek verwenden, müssen Sie auch die Singlethread-Version der alten iostream
Bibliothek oder der C++-Standardbibliothek verwenden.
Sie können keine Aufrufe der alten iostream
Bibliotheksfunktionen und der neuen Standard-C++-Bibliotheksfunktionen iostream
kombinieren.
Warum erhalte ich Compilerwarnungen C4786 oder C4788? Keines der Symbole in meinem Programm ist annähernd 255 Zeichen lang
C4786 oder C4788 wird ausgegeben, wenn der Name eines Symbols mehr als 255 Zeichen lang ist. Dieses Problem tritt häufig bei der Vorlagenklasse auf und STL
verwendet die Vorlagenklasse häufig.
Das Ignorieren dieser Warnung ist sicher. Verwenden Sie eine #pragma
Warnung (Deaktivieren: 4786,4788), um die Meldungen zu unterdrücken.
Warum erhalte ich eine Nachricht (C4530: C++-Ausnahmehandler verwendet, aber die Entladungssemantik ist nicht aktiviert. Angeben von -GX)
Programme, die die C++-Standardbibliothek verwenden, müssen mit aktivierter C++-Ausnahmebehandlung kompiliert werden. Die C++-Ausnahmebehandlung kann mit einer der folgenden Methoden aktiviert werden:
- Auswählen der Option Ausnahmebehandlung aktivieren in der C++-Sprachkategorie der Registerkarte C/C++ im Dialogfeld Projekteinstellungen .
- Verwenden des Compilerschalters /GX .
Warum erhalte ich den Compilerfehler C2146, gefolgt von C2065 und schließlich C2143, die alle auf dieselbe Zeile in meiner Quelle verweisen
Diese Fehlersequenz kann durch den folgenden Konstrukttyp verursacht werden:
vector<int, allocator<int>>iV;
Das Problem wird durch die aufeinander folgende >>
am Ende der Deklaration verursacht. Die Lösung besteht darin, ein Leerzeichen zwischen zwei Zeichen einzufügen, sodass das Konstrukt zu folgendem Konstrukt wird:
vector<int, allocator<int> > iV;
Sie entspricht der vorgeschlagenen ANSII-Spezifikation.