Häufig gestellte Fragen zur C++-Standardbibliothek

Dieser Artikel enthält eine Liste der häufig gestellten Fragen (FAQs) zu den Standard C++-Bibliotheken und die Antworten auf diese Fragen.

Originalversion des Produkts:   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) und Eingabe/Ausgabe.

Die C++-Standardbibliothek kann in die folgenden Kategorien unterteilt werden:

  1. 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 wichtige Organisationskonzepte gruppiert werden:

    • Container: Vorlagenklassen, die allgemeine Methoden zum Organisieren von Daten unterstützen, z vector. B. , list, deque, stack, queue, setund map.

    • Algorithmen: Vorlagenfunktionen zum Ausführen allgemeiner Vorgänge für Sequenzen von Objekten, z. B. funktionell, algorithmus und numerisch.

    • Iteratoren: Der Kleber, der Algorithmen und Container zusammenfüge, z. B. Hilfsprogramm, Iterator und Arbeitsspeicher.

  2. Input/Output enthält Komponenten für Vorwärtsdeklarationen von iostreams (iosfwd), vordefinierten iostreams Objekten (iostream), Basisklassen iostreams (ios), Datenstrompufferung (streambuf), Streamformatierung und Manipulatoren (iosmanip, istream, ostream), Zeichenfolgenstreams (sstream) und Dateistreams (fstream).

  3. Weitere C++-Standardheader sind:

    • Sprachunterstützung: Komponenten für allgemeine Typdefinitionen, die in der gesamten Bibliothek verwendet werden (cstddef), Merkmale der vordefinierten Typen (limits, , climits), Funktionen, cfloatdie den Start und das Beenden eines C++-Programms unterstützen (cstdlib), Unterstützung für dynamische Speicherverwaltung (new), Unterstützung für die dynamische Typidentifikation (typeinfo), Unterstützung für die Ausnahmeverarbeitung (exception) und andere Laufzeitunterstützung (cstdarg, ctime, csetlmp). csignal

    • Diagnose: Komponenten zum Melden verschiedener Arten von außergewöhnlichen Bedingungen (stdexcept), Zum Dokumentieren von Programm assertionen (cassert) und einer globalen Variablen für Fehlernummerncodes (cerrno).

    • Zeichenfolgen: Komponenten für Zeichenfolgenklassen (string) und mit Null beendete Sequenzhilfsprogramme (cctype, cwctype, cwchar).

    • Lokalisierung: Komponenten, die von C++-Programmen zum Kapseln kultureller Unterschiede verwendet werden können. Die Gebietsschemafunktion umfasst Internationalisierungsunterstützung für Zeichenklassifizierung und Zeichenfolgensortierung, numerische, monetäre und Datums-/Uhrzeitformatierung und Analyse sowie nachrichtenabruf (locale, clocale).

Was ist der Unterschied zwischen CRT- und Standard C++-Bibliothek? Zu den Bibliothekscompileroptionen der Laufzeit gehören

Visual C++ enthält neben den Microsoft Foundation Classes (MFC)-Bibliotheken die folgenden Bibliotheken:

  • Grundlegende C-Runtime-Bibliothek
  • C++-Standardbibliothek
Bibliothekstypen und zugehörige Compilerschalter C-Runtime-Standardbibliothek/C++-Standardbibliothek
Singlethread (/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 für /ML - und /MLd-Bibliotheken für statisch singlethreaded-Bibliotheken wurden in Visual C++ entfernt.
  • MSVCPRT.lib und MSVCPRTD.lib sind statische Bibliotheken und verfügen nicht über dynamische Verknüpfungsbibliotheken (DYNAMIC Link Libraries, DLLs), die direkt damit 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 "Ignore Default Library " (/NOD oder NODEFAULTLIB) verwenden, müssen Sie MSVCPRT.lib (oder MSVCPRTD.lib) und MSVCRT.lib (oder MSVCRTD.lib) mit Ihrer Anwendung verknüpfen. Andernfalls erhalten Sie Linkerfehler (LNK2001: nicht aufgelöste externe Elemente in MSVCPRT.lib oder MSVCPRTD.lib), wenn Sie Ihre Anwendung verknüpfen. Je nachdem, welche Kopfzeilen 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 Standard C++-Header 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 alter `iostream` Funktionen 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. Aufrufe der alten iostream Bibliothek und der neuen Standard C++-Bibliothek können nicht miteinander gemischt werden.

So wird's gemacht: Festlegen von Standard-C++-Bibliotheken als Standardbibliotheken für meine Anwendung

Wenn Sie die Standard-C++-Bibliotheken als Standard festlegen möchten, fügen Sie einen oder mehrere der neuen Standard C++-Header ein. Aufrufe der alten iostream und der neuen C++-Standardbibliothek können nicht miteinander gemischt werden. Vorhandene Bibliotheken (statische oder dynamische Verknüpfung), 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, verursacht dies Konflikte mit C-Runtime-Bibliotheken.

Nein. Microsoft Foundation Classes (MFC) verwendet keine C-Runtime-Funktionen, die mit den C++-Standardbibliotheken in Konflikt stehen.

Warum ich einen Fehler erhalte (Fehler C2065: '`cout`' : nicht deklarierter Bezeichner), obwohl ich eingeschlossen habe `iostream`

Die C++-Standardbibliothek ist in einem eigenen Namespace stdimplementiert. Stellen Sie sicher, dass Sie am Anfang Des Programms die folgende Anweisung hinzufügen:

using namespace std;

Oder qualifizieren Sie jeden Standard C++-Bibliotheksbezeichner mit Namespace std, std::coutz. B. .

Warum ich einen Fehler erhalte (Compilerfehler C2371: Neudefinition des Bezeichners; verschiedene Basistypen)

In Versionen von Visual C++ vor Visual C++ 2005 verursacht das Mischen von Standard-C++-Headern und alten iostream Headern diesen Fehler, auch wenn sie in verschiedenen Quelldateien enthalten sind. Es folgen die verschiedenen Kopfzeilen:

  • Alte iostream Kopfzeilen:

    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 ich Nachricht erhalte (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 (single-threaded 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 LIBCP.lib (Singlethread-ML), LIBCPMT.lib (multithreaded MT) oder MSVCPRT.lib (multithreaded dll MD) hinzufügen.

Mischen Sie keine verschiedenen Versionen der Bibliotheken. Wenn Sie z. B. die Singlethread-Version der C-Runtime-Bibliothek verwenden, müssen Sie auch die Singlethreadversion der alten iostream Bibliothek oder standard C++-Bibliothek verwenden.

Aufrufe der alten iostream Bibliotheksfunktionen und der neuen Standard-C++-Bibliotheksfunktionen iostream können nicht miteinander kombiniert werden.

Warum erhalte ich Compilerwarnungen C4786 oder C4788? Keines der Symbole in meinem Programm ist irgendwo fast 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 umfassend.

Das Ignorieren dieser Warnung ist sicher. Verwenden Sie eine #pragma Warnung (deaktivieren: 4786,4788), um die Nachrichten zu unterdrücken.

Warum ich eine Nachricht erhalte (C4530: C++-Ausnahmehandler wird verwendet, aber die Entladesemantik ist nicht aktiviert. Specify -GX)

Programme, die die C++-Standardbibliothek verwenden, müssen mit aktivierter C++-Ausnahmebehandlung kompiliert werden. Die Behandlung von C++-Ausnahmen kann mit einer der folgenden Methoden aktiviert werden:

  • Aktivieren der Option "Ausnahmebehandlung aktivieren " in der C++-Sprachkategorie auf der Registerkarte "C/C++ " im Dialogfeld " Projekteinstellungen ".
  • Verwenden des /GX-Compilerschalters .

Warum ich Compilerfehler C2146 erhalte, gefolgt von C2065 und schließlich C2143, die alle auf die gleiche Zeile in meiner Quelle zeigen

Diese Fehlersequenz kann durch den folgenden Konstrukttyp verursacht werden:

vector<int, allocator<int>>iV;

Das Problem wird durch das aufeinander folgende >> Ende der Deklaration verursacht. Die Lösung besteht darin, ein Leerzeichen zwischen zwei Zeichen zu platzieren, sodass das Konstrukt folgendermaßen ausfällt:

vector<int, allocator<int> > iV;

Es entspricht der vorgeschlagenen ANSII-Spezifikation.