В этой статье приводится список часто задаваемых вопросов о библиотеках C++ уровня "Стандартный" и ответы на эти вопросы.
Исходная версия продукта: Visual C++
Исходный номер базы знаний: 154419
Что содержит библиотека C++ уровня "Стандартный"
Стандартная библиотека C++ предоставляет расширяемую платформу и содержит компоненты для поддержки языков, диагностика, общих служебных программ, строк, языковых стандартов, стандартной библиотеки шаблонов (контейнеры, итераторы, алгоритмы и числовые значения), а также ввода и вывода.
Стандартную библиотеку C++ можно разделить на следующие категории:
Компоненты стандартной библиотеки шаблонов (STL) предоставляют программе C++ доступ к подмножествию наиболее широко используемых алгоритмов и структур данных. Заголовки STL можно сгруппировать в три основных понятия организации:
Контейнеры: классы шаблонов, поддерживающие распространенные способы организации данных, такие как
vector
,list
,deque
,stack
,queue
,set
иmap
.Алгоритмы: функции шаблона для выполнения общих операций с последовательности объектов, таких как функциональные, алгоритмические и числовые.
Итераторы: клей, который объединяет алгоритмы и контейнеры, такие как служебная программа, итератор и память.
Входные и выходные данные включают компоненты для прямого объявления
iostreams
(iosfwd
), предопределенныхiostreams
объектов (iostream
), базовыхiostreams
классов (ios
), буферизации потоков (streambuf
), форматирования потоков и манипуляторов (iosmanip
,istream
,ostream
), строковых потоков (sstream
) и файловых потоков (fstream
).Другие стандартные заголовки 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.