Udostępnij za pośrednictwem


Często zadawane pytania dotyczące standardowej biblioteki C++

Ten artykuł zawiera listę często zadawanych pytań dotyczących bibliotek standardu C++ i odpowiedzi na te pytania.

Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 154419

Co zawiera standardowa biblioteka C++

Standardowa biblioteka C++ udostępnia rozszerzalną strukturę i zawiera składniki do obsługi języka, diagnostyki, ogólnych narzędzi, ciągów, ustawień regionalnych, standardowej biblioteki szablonów (kontenerów, iteratorów, algorytmów i liczb) oraz danych wejściowych/wyjściowych.

Standardową bibliotekę C++ można podzielić na następujące kategorie:

  1. Składniki standardowej biblioteki szablonów (STL) zapewniają program C++ z dostępem do podzestawu najczęściej używanych algorytmów i struktur danych. Nagłówki STL można pogrupować w trzy główne pojęcia dotyczące organizowania:

    • Kontenery: klasy szablonów obsługujące typowe sposoby organizowania danych, takie jak vector, list, deque, stack, , queue, seti map.

    • Algorytmy: funkcje szablonu do wykonywania typowych operacji na sekwencjach obiektów, takich jak funkcjonalne, algorytmy i numeryczne.

    • Iteratory: klej, który wkleja algorytmy i kontenery, takie jak narzędzie, iterator i pamięć.

  2. Dane wejściowe/wyjściowe obejmują składniki do przekazywania deklaracji (), wstępnie zdefiniowanych iostreams obiektów (iostream), klas bazowych iostreams (ios), buforowania strumienia (streambuf), formatowania strumienia i manipulatorów (iosmanip, , istreamostream), strumieni ciągów (sstream) i strumieni plików (fstream).iosfwdiostreams

  3. Inne nagłówki standardowego języka C++ to:

    • Obsługa języka: składniki dla typowych definicji typów używanych w całej bibliotece (cstddef), cechy wstępnie zdefiniowanych typów (limits, cfloat, ), climitsfunkcje obsługujące uruchamianie i kończenie programu C++ (), obsługa dynamicznego zarządzania pamięcią (newcstdlib), obsługa identyfikacji typu dynamicznego (typeinfo), obsługa przetwarzania wyjątków (exception) i inne wsparcie środowiska uruchomieniowego (cstdarg, , ctimecsetlmp, csignal).

    • Diagnostyka: składniki do raportowania kilku rodzajów wyjątkowych warunków (stdexcept), dokumentowanie asercji programu (cassert) i zmienna globalna dla kodów numerów błędów (cerrno).

    • Ciągi: składniki dla klas ciągów (string) i narzędzi sekwencji zakończonych null (cctype, cwctype, cwchar).

    • Lokalizacja: składniki, których programy C++ mogą używać do hermetyzacji różnic kulturowych. Obiekt ustawień regionalnych obejmuje obsługę internacjonalizacji klasyfikacji znaków i sortowania ciągów, formatowania liczbowego, pieniężnego oraz formatowania i analizowania daty/godziny oraz pobierania komunikatów (locale, clocale).

Jaka jest różnica między biblioteką CRT i standardową biblioteką C++? Jakie biblioteki będą zawierać opcje kompilatora biblioteki środowiska uruchomieniowego

Oprócz bibliotek Microsoft Foundation Classes (MFC) program Visual C++ zawiera następujące biblioteki:

  • Podstawowa biblioteka środowiska C-Runtime
  • Standardowa biblioteka C++
Typy bibliotek i powiązane przełączniki kompilatora Podstawowa biblioteka środowiska uruchomieniowego języka C / standardowa biblioteka C++
Jednowątkowo (/ML) LIBC. LIB/ LIBCP. LIB
Debugowanie jednowątkowe (/MLd) LIBCD. LIB/ LIBCPD. LIB
Wielowątkowości (/MT) LIBCMT. LIB / LIBCPMT. LIB
Debugowanie wielowątkowości (/MTd) LIBCMTD. LIB / LIBCPMTD. LIB
Wielowątkowa DLL (/MD) MSVCRT. LIB / MSVCPRT. LIB
Debugowanie wielowątkowości /DLL (MDd) MSVCRTD. LIB / MSVCPRTD. LIB

Uwaga

  • Opcje kompilatora biblioteki /ML i /MLd dla bibliotek statycznie jednowątkowych zostały usunięte w języku Visual C++.
  • Biblioteki MSVCPRT.lib i MSVCPRTD.lib są bibliotekami statycznymi i nie mają żadnych bibliotek dynamicznych linków (DLL) bezpośrednio z nimi powiązanych. Biblioteki te są również zależne od plików MSVCRT.lib i MSVCRTD.lib. Jeśli masz jakiekolwiek aplikacje korzystające z opcji MSVCPRT.lib lub MSVCPRTD.lib i używasz opcji Ignoruj bibliotekę domyślną (/NOD lub NODEFAULTLIB), połącz z aplikacją plik MSVCPRT.lib (lub MSVCPRTD.lib) i MSVCRT.lib (lub MSVCRTD.lib). W przeciwnym razie podczas łączenia aplikacji zostaną wyświetlone błędy konsolidatora (LNK2001: nierozwiązane elementy zewnętrzne w pliku MSVCPRT.lib lub MSVCPRTD.lib). W zależności od nagłówków używanych w kodzie może być również połączona biblioteka ze standardowej biblioteki C++.

Plik nagłówka use_ansi.h zawiera #pragma instrukcje, które wymuszają powiązanie standardowej biblioteki C++. Wszystkie nagłówki standardowego języka C++ obejmują use_ansi.h: w przypadku uwzględnienia dowolnego nagłówka standardowego języka C++ w aplikacji biblioteka Standardowa C++ będzie domyślnie połączona.

Nagłówki standardowego języka C++

Kolumna 1 Kolumna 2 Kolumna 3 Kolumna 4
ALGORYTM BITSET ZŁOŻONYCH DEQUE
WYJĄTEK FSTREAM FUNKCJONALNE IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
STERUJĄCA LIMITY LISTY USTAWIEŃ REGIONALNYCH
MAPĘ PAMIĘCI LICZBOWE OSTREAM
KOLEJKI USTAWIĆ SSTREAM STOSU
STDEXCEPT STREAMBUF CIĄG STRSTREAM
TYPEINFO NARZĘDZIE VALARRAY WEKTOR

Jak zachować stare funkcje "iostream" z programu Visual C++ na platformie .NET 2003 lub starszych wersjach, jeśli przenieśę projekt z wcześniejszej wersji

Jeśli chcesz zachować starą iostreambibliotekę (iostream.h), uwzględnij co najmniej jeden stary iostream plik nagłówka w kodzie. Nie używaj nowych nagłówków standardu C++. Nie można mieszać wywołań do starej iostream biblioteki i nowej standardowej biblioteki C++.

Jak ustawić biblioteki Standardowa języka C++ jako biblioteki domyślne dla mojej aplikacji

Jeśli chcesz ustawić standardowe biblioteki C++ jako domyślne, dołącz co najmniej jeden z nowych nagłówków standardowego języka C++. Nie można mieszać wywołań do starej iostream i nowej standardowej biblioteki C++. Istniejące biblioteki (link statyczny lub dynamiczny), które używają starych iostream funkcji, będą musiały zostać zmodyfikowane w celu używania standardowych funkcji biblioteki iostream języka C++.

Jeśli używam standardowych bibliotek C++ w aplikacjach MFC, spowoduje to konflikty z bibliotekami C-Runtime

L.p. Klasy Microsoft Foundation (MFC) nie używają żadnych funkcji środowiska C-Runtime, które będą kolidować ze standardowymi bibliotekami C++.

Dlaczego występuje błąd (błąd C2065: ""cout"" : niezadeklarowany identyfikator), mimo że uwzględniono element "iostream"

Standardowa biblioteka C++ jest implementowana we własnej przestrzeni stdnazw . Na początku programu dodaj następującą instrukcję:

using namespace std;

Możesz też kwalifikować każdy identyfikator biblioteki Standardowa C++ za pomocą przestrzeni stdnazw , na przykład std::cout.

Dlaczego występuje błąd (błąd kompilatora C2371: ponowne definiowanie identyfikatora; różne typy podstawowe)

W wersjach programu Visual C++, które są starsze niż Visual C++ 2005, mieszanie nagłówków Standardowa C++ i starych iostream nagłówków powoduje ten błąd, nawet jeśli są one zawarte w różnych plikach źródłowych. Poniżej przedstawiono różne nagłówki:

  • Stare iostream nagłówki:

    Kolumna 1 Kolumna 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • Standardowe nagłówki języka C++:

    Kolumna 1 Kolumna 2 Kolumna 3 Kolumna 4
    ALGORYTM BITSET ZŁOŻONYCH DEQUE
    WYJĄTEK FSTREAM FUNKCJONALNE IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    STERUJĄCA LIMITY LISTY USTAWIEŃ REGIONALNYCH
    MAPĘ PAMIĘCI LICZBOWE OSTREAM
    KOLEJKI USTAWIĆ SSTREAM STOSU
    STDEXCEPT STREAMBUF CIĄG STRSTREAM
    TYPEINFO NARZĘDZIE VALARRAY WEKTOR

Dlaczego otrzymuję komunikat (LNK2001: nierozwiązany symbol zewnętrzny "symbol" ;) w wywołaniu funkcji "iostream", gdy projekt jest kompilowany przy użyciu funkcji Ignoruj biblioteki domyślne

Funkcje iostream zostały usunięte z biblioteki C-Runtime.

Jeśli używasz starych iostream funkcji, musisz dodać kolejną bibliotekę LIBCI.lib (ml z jednym wątkiem ),LIBCIMT.lib (wielowątkowość MT) lub MSVCIRT.lib (wielowątkowa biblioteka DLL MD). Te biblioteki zostały usunięte z programu Visual C++.

Jeśli używasz nowych iostream funkcji dołączonych do standardowej biblioteki C++, musisz dodać inną bibliotekę LIBCP.lib (ml z jednym wątkiem ),LIBCPMT.lib (wielowątkowość MT) lub MSVCPRT.lib (wielowątkowa biblioteka DLL MD).

Nie mieszaj różnych wersji bibliotek. Jeśli na przykład używasz jednowątkowej wersji biblioteki języka C-Runtime, musisz również użyć jednowątkowej wersji starej iostream biblioteki lub standardowej biblioteki C++.

Nie można mieszać wywołań do starych iostream funkcji biblioteki i nowych standardowych funkcji biblioteki iostream C++.

Dlaczego omówiono ostrzeżenia kompilatora C4786 lub C4788? Żaden z symboli w moim programie nie ma długości prawie 255 znaków

C4786 lub C4788 jest wystawiany, gdy nazwa symbolu przekracza 255 znaków długości. Ten problem często występuje w przypadku klasy szablonu i STL intensywnie używa klasy szablonu.

Ignorowanie tego ostrzeżenia jest bezpieczne. #pragma Użyj ostrzeżenia (wyłącz: 4786 4788), aby pominąć komunikaty.

Dlaczego omówiono komunikat (C4530: Użyto programu obsługi wyjątków języka C++, ale semantyka odwijania nie jest włączona. Określ -GX)

Programy korzystające z standardowej biblioteki C++ muszą być kompilowane z włączoną obsługą wyjątków języka C++. Obsługę wyjątków języka C++ można włączyć za pomocą jednej z następujących metod:

  • Wybranie opcji Włącz obsługę wyjątków w kategorii języka C++ na karcie C/C++ w oknie dialogowym Ustawienia projektu .
  • Przy użyciu przełącznika kompilatora /GX .

Dlaczego występuje błąd kompilatora C2146, a następnie C2065, a na koniec C2143, wszystkie wskazujące ten sam wiersz w moim źródle

Ta sekwencja błędów może być spowodowana przez następujący typ konstrukcji:

vector<int, allocator<int>>iV;

Problem jest spowodowany przez kolejnych >> na końcu deklaracji. Rozwiązaniem jest umieszczenie spacji między dwoma znakami, więc konstrukcja staje się następująca:

vector<int, allocator<int> > iV;

Jest to zgodne z proponowaną specyfikacją ANSII.