Часто задаваемые вопросы о стандартной библиотеке C++

В этой статье приводится список часто задаваемых вопросов о библиотеках C++ уровня "Стандартный" и ответы на эти вопросы.

Исходная версия продукта: Visual C++
Исходный номер базы знаний: 154419

Что содержит библиотека C++ уровня "Стандартный"

Стандартная библиотека C++ предоставляет расширяемую платформу и содержит компоненты для поддержки языков, диагностика, общих служебных программ, строк, языковых стандартов, стандартной библиотеки шаблонов (контейнеры, итераторы, алгоритмы и числовые значения), а также ввода и вывода.

Стандартную библиотеку C++ можно разделить на следующие категории:

  1. Компоненты стандартной библиотеки шаблонов (STL) предоставляют программе C++ доступ к подмножествию наиболее широко используемых алгоритмов и структур данных. Заголовки STL можно сгруппировать в три основных понятия организации:

    • Контейнеры: классы шаблонов, поддерживающие распространенные способы организации данных, такие как vector, list, deque, stack, queue, setи map.

    • Алгоритмы: функции шаблона для выполнения общих операций с последовательности объектов, таких как функциональные, алгоритмические и числовые.

    • Итераторы: клей, который объединяет алгоритмы и контейнеры, такие как служебная программа, итератор и память.

  2. Входные и выходные данные включают компоненты для прямого объявления iostreams (iosfwd), предопределенных iostreams объектов (iostream), базовых iostreams классов (ios), буферизации потоков (streambuf), форматирования потоков и манипуляторов (iosmanip, istream, ostream), строковых потоков (sstream) и файловых потоков (fstream).

  3. Другие стандартные заголовки C++ включают:

    • Поддержка языков: компоненты для общих определений типов, используемых в библиотеке (),cstddef характеристики предопределенных типов (limits, , climits), функции, cfloatподдерживающие запуск и завершение программы C++ (cstdlib), поддержку динамического управления памятью (new), поддержку динамической идентификации типов (typeinfo), поддержку обработки исключений (exception) и другую поддержку среды выполнения (cstdarg, ctime, csetlmp). csignal

    • Диагностика: компоненты для отчетности нескольких типов исключительных условий (stdexcept), документирования утверждений программы (cassert) и глобальной переменной для кодов номеров ошибок (cerrno).

    • Strings: компоненты для строковых классов (string) и служебных программ последовательности с завершением null (cctype, cwctype, cwchar).

    • Локализация: компоненты, которые программы C++ могут использовать для инкапсуляции культурных различий. Средство языкового стандарта включает поддержку интернационализации для классификации символов и параметров сортировки строк, числовых, денежных и дат и времени форматирования и анализа даты и времени, а также получения сообщений (locale, clocale).

В чем разница между CRT и стандартной библиотекой C++? Какие библиотеки будут включать параметры компилятора библиотеки среды выполнения

Visual C++ включает следующие библиотеки помимо библиотек Microsoft Foundation Classes (MFC):

  • Базовая библиотека C-Runtime
  • Стандартная библиотека C++
Типы библиотек и связанные параметры компилятора Базовая библиотека среды выполнения C или стандартная библиотека C++
Однопотоковый (/ML) LIBC. LIB/LIBCP. LIB
Отладка однопотоковых (/MLd) LIBCD. LIB/ LIBCPD. LIB
Многопоточность (/MT) LIBCMT. LIB/ LIBCPMT. LIB
Отладка многопоточности (/MTd) LIBCMTD. LIB/ LIBCPMTD. LIB
Многопоточные библиотеки DLL (/MD) MSVCRT. LIB/ MSVCPRT. LIB
Отладка многопоточности /DLL (MDd) MSVCRTD. LIB/ MSVCPRTD. LIB

Примечание.

  • Параметры компилятора библиотек /ML и /MLd для статических однопоточных библиотек были удалены в Visual C++.
  • MSVCPRT.lib и MSVCPRTD.lib являются статическими библиотеками и не имеют библиотек динамической компоновки (DLL) напрямую с ними. Эти библиотеки также зависят от MSVCRT.lib и MSVCRTD.lib соответственно. Если у вас есть приложения, использующие MSVCPRT.lib или MSVCPRTD.lib , и вы используете параметр Игнорировать библиотеку по умолчанию (/NOD или NODEFAULTLIB), обязательно свяжите MSVCPRT.lib (или MSVCPRTD.lib) и MSVCRT.lib (или MSVCRTD.lib) с приложением. В противном случае при связывании приложения вы получите ошибки компоновщика (LNK2001: неразрешенные внешние элементы в MSVCPRT.lib или MSVCPRTD.lib). В зависимости от заголовков, используемых в коде, также может быть связана библиотека из стандартной библиотеки C++.

Файл заголовка use_ansi.h содержит инструкции #pragma , которые принудительно связывают стандартную библиотеку C++. Все заголовки C++ уровня "Стандартный" включают use_ansi.h. Если вы включите в приложение любой стандартный заголовок C++, библиотека Standard C++ будет связана по умолчанию.

Стандартные заголовки C++

Столбец 1 Столбец 2 Столбец 3 Столбец 4
АЛГОРИТМ BITSET КОМПЛЕКС DEQUE
ИСКЛЮЧЕНИЕ FSTREAM ФУНКЦИОНАЛЬНЫЕ IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
ИТЕРАТОР ОГРАНИЧЕНИЯ СПИСОК ЯЗЫКОВОГО СТАНДАРТА
КАРТА ПАМЯТИ ЧИСЛОВЫЕ OSTREAM
ОЧЕРЕДИ УСТАНОВИТЬ SSTREAM СТЕКА
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO УТИЛИТА VALARRAY ВЕКТОР

Сохранение старых функций iostream из Visual C++ .NET 2003 или более ранних версий при переносе проекта из более ранней версии

Если вы хотите сохранить старую iostream библиотеку (iostream.h), добавьте в код один или несколько старых iostream файлов заголовков. Не используйте новые стандартные заголовки C++. Вы не можете сочетать вызовы старой iostream библиотеки и новой стандартной библиотеки C++.

Как сделать стандартные библиотеки C++ библиотеками по умолчанию для моего приложения

Если вы хотите сделать стандартные библиотеки C++ по умолчанию, добавьте один или несколько новых стандартных заголовков C++. Нельзя смешивать вызовы к старой iostream и новой стандартной библиотеке C++. Существующие библиотеки (статические или динамические связи), использующие старые iostream функции, придется изменить для использования стандартных функций библиотеки iostream C++.

Если я использую стандартные библиотеки C++ в приложениях MFC, приведет ли это к конфликтам с библиотеками C-Runtime

Нет. Microsoft Foundation Classes (MFC) не использует функции C-Runtime, которые будут конфликтовать со стандартными библиотеками C++.

Почему я получаю ошибку (ошибка C2065: ''cout'' : необъявленный идентификатор), даже если я включил "iostream"

Стандартная библиотека C++ реализуется в собственном пространстве имен std. Обязательно добавьте следующую инструкцию в начале программы:

using namespace std;

Можно также указать каждый идентификатор стандартной библиотеки C++ с помощью пространства stdимен, например std::cout.

Почему я получаю ошибку (ошибка компилятора C2371: переопределение идентификатора; разные базовые типы)

В версиях Visual C++, более ранних, чем Visual C++ 2005, сочетание стандартных заголовков C++ и старых iostream заголовков вызывает эту ошибку, даже если они включены в разные исходные файлы. Ниже приведены различные заголовки.

  • Старые iostream заголовки:

    Столбец 1 Столбец 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • Стандартные заголовки C++:

    Столбец 1 Столбец 2 Столбец 3 Столбец 4
    АЛГОРИТМ BITSET КОМПЛЕКС DEQUE
    ИСКЛЮЧЕНИЕ FSTREAM ФУНКЦИОНАЛЬНЫЕ IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    ИТЕРАТОР ОГРАНИЧЕНИЯ СПИСОК ЯЗЫКОВОГО СТАНДАРТА
    КАРТА ПАМЯТИ ЧИСЛОВЫЕ OSTREAM
    ОЧЕРЕДИ УСТАНОВИТЬ SSTREAM СТЕКА
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO УТИЛИТА VALARRAY ВЕКТОР

Почему я получаю сообщение (LNK2001: неразрешенный внешний символ "symbol" ;) при вызовах функции iostream при сборке проекта с использованием библиотек по умолчанию

Функции iostream удалены из библиотеки C-Runtime.

Если вы используете старые iostream функции, необходимо добавить другую библиотеку LIBCI.lib (однопоточный ML), LIBCIMT.lib (многопоточный MT) или MSVCIRT.lib (многопоточный DLL MD). Эти библиотеки удалены из Visual C++.

Если вы используете новые iostream функции, включенные в стандартную библиотеку C++, необходимо добавить другую библиотеку LIBCP.lib (однопоточный ML), LIBCPMT.lib (многопоточный MT) или MSVCPRT.lib (многопоточный DLL MD).

Не смешивайте разные версии библиотек. Например, если вы используете однопоточную версию библиотеки C-Runtime, необходимо также использовать однопотоковую версию старой iostream библиотеки или стандартную библиотеку C++.

Нельзя смешивать вызовы старых iostream функций библиотеки и новых стандартных функций библиотеки iostream C++.

Почему я получаю предупреждения компилятора C4786 или C4788? Ни один из символов в моей программе где-либо около 255 символов в длину

C4786 или C4788 выдается, если длина имени символа превышает 255 символов. Эта проблема часто возникает с классом шаблона и STL широко использует класс шаблона.

Игнорировать это предупреждение безопасно. #pragma Используйте предупреждение (отключение: 4786 4788) для подавления сообщений.

Почему я получаю сообщение (C4530: используется обработчик исключений C++, но семантика отмены не включена. Укажите -GX)

Программы, использующие стандартную библиотеку C++, должны компилироваться с включенной обработкой исключений C++. Обработку исключений C++ можно включить одним из следующих методов:

  • Выбор параметра Включить обработку исключений в категории языка C++ на вкладке C/C++ в диалоговом окне Параметры проекта .
  • Использование параметра компилятора /GX .

Почему я получаю ошибку компилятора C2146, за которой следует C2065 и, наконец, C2143, все указывает на одну и ту же строку в источнике

Эта последовательность ошибок может быть вызвана следующим типом конструкции:

vector<int, allocator<int>>iV;

Проблема возникает из-за последовательности >> в конце объявления. Решение заключается в том, чтобы поместить пробел между двумя символами, чтобы конструкция стала:

vector<int, allocator<int> > iV;

Это соответствует предлагаемой спецификации ANSII.