Bearbeiten

Häufig gestellte Fragen zur C++-Standardbibliothek

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:

  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 Hauptorganisationskonzepte gruppiert werden:

    • Container: Vorlagenklassen, die gängige Methoden zum Organisieren von Daten unterstützen, zvector. B. , list, deque, stack, queuesetund map.

    • 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.

  2. Input/Output umfasst Komponenten für Vorwärtsdeklarationen von iostreams (iosfwd), vordefinierten iostreams Objekten (iostream), Basisklassen iostreams (ios), Streampufferung (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, 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 stdimplementiert. 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::coutz. 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.