20 Library introduction [library]

20.5 Library-wide requirements [requirements]

20.5.1 Library contents and organization [organization]

[contents] описывает сущности и макросы, определенные в стандартной библиотеке C ++. [headers] перечисляет заголовки стандартной библиотеки и некоторые ограничения на эти заголовки. [compliance] перечисляет требования к автономной реализации стандартной библиотеки C ++.

20.5.1.1 Library contents [contents]

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

Все объекты библиотеки, кроме operator new и operator delete , определены в пространстве имен std или пространствах имен, вложенных в пространство имен std. Не указано, объявляются ли имена, объявленные в определенном пространстве имен, непосредственно в этом пространстве имен или во встроенном пространстве имен внутри этого пространства имен.166167

Всякий раз, когдаx упоминается имя, определенное в стандартной библиотеке,x предполагается , что имя полностью определено как ​::​std​::​x, если явно не указано иное. Например, еслиEffects: раздел для библиотечной функцииF описывается как вызывающая библиотечная функцияG,​::​std​::​G имеется в виду функция .

Заголовки стандартной библиотеки C (Приложение[depr.c.headers]) также определяют имена в глобальном пространстве имен, в то время как заголовки C ++ для средств библиотеки C ([headers]) могут также определять имена в глобальном пространстве имен.

Это дает разработчикам свободу использовать встроенные пространства имен для поддержки нескольких конфигураций библиотеки.

20.5.1.2 Headers [headers]

Каждый элемент стандартной библиотеки C ++ объявлен или определен (при необходимости) в файле header.168

Стандартная библиотека C ++ предоставляет C++ library headers, как показано в Табл16.

Таблица16 - заголовки библиотеки C ++
<algorithm> <future> <numeric> <strstream>
<any> <initializer_­list> <optional> <system_­error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_­traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_­allocator> <unordered_­map>
<condition_­variable> <limits> <set> <unordered_­set>
<deque> <list> <shared_­mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_­list> <memory_­resource> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_­view>

Возможности стандартной библиотеки C представлены в дополнительных заголовках, показанных в таблице17.169

Таблица17 - Заголовки C ++ для средств библиотеки C
<cassert> <cinttypes> <csignal> <cstdio> <cwchar>
<ccomplex> <ciso646> <cstdalign> <cstdlib> <cwctype>
<cctype> <climits> <cstdarg> <cstring>
<cerrno> <clocale> <cstdbool> <ctgmath>
<cfenv> <cmath> <cstddef> <ctime>
<cfloat> <csetjmp> <cstdint> <cuchar>

За исключением указанных в пунктах[library] через[thread] и приложение[depr], содержание каждого заголовкаcname такое же , как и у соответствующего заголовка ,name.h как указано в разделеC standard library. Однако в стандартной библиотеке C ++ объявления (за исключением имен, которые определены как макросы в C) находятся в пределах namespace scope пространства именstd. Не указано, были ли эти имена (включая любые перегрузки, добавленные в разделах[language.support] по[thread] и Приложение[depr]) сначала объявлены в области глобального пространства имен, а затемstd явно введены в пространство имен using-declarations.

Имена, которые определены как макросы в C, должны определяться как макросы в стандартной библиотеке C ++, даже если C предоставляет лицензию на реализацию в качестве функций. [ Note: Имена , определенные как макросы в C включают в себя следующее: assert,offsetof,setjmp,va_­arg, va_­end, иva_­start. ]end note

Имена, которые определены как функции в C, должны быть определены как функции в стандартной библиотеке C ++.170

Идентификаторы, которые являются ключевыми словами или операторами в C ++, не должны определяться как макросы в заголовках стандартной библиотеки C ++.171

[depr.c.headers], Заголовки стандартной библиотеки C, описывает эффекты использования формыname.h (заголовок C) в программе на C ++.172

Приложение K к стандарту C описывает большое количество функций с соответствующими типами и макросами, которые «способствуют более безопасному и безопасному программированию», чем многие традиционные функции библиотеки C. Имена функций имеют суффикс_­s; большинство из них предоставляют ту же услугу, что и функция библиотеки C с именем без суффиксов, но обычно принимают дополнительный аргумент, значение которого является размером массива результатов. Если включен какой-либо заголовок C ++, это определяется реализацией, объявлено ли какое-либо из этих имен в глобальном пространстве имен. (Ни один из них не объявлен в пространстве именstd.)

В таблице18 перечислены имена Приложения K, которые могут быть объявлены в каком-либо заголовке. На эти имена также распространяются ограничения[macro.names].

Таблица18 - Стандартные названия C, приложения K
abort_­handler_­s mbstowcs_­s strncat_­s vswscanf_­s
asctime_­s memcpy_­s strncpy_­s vwprintf_­s
bsearch_­s memmove_­s strtok_­s vwscanf_­s
constraint_­handler_­t memset_­s swprintf_­s wcrtomb_­s
ctime_­s printf_­s swscanf_­s wcscat_­s
errno_­t qsort_­s tmpfile_­s wcscpy_­s
fopen_­s RSIZE_­MAX TMP_­MAX_­S wcsncat_­s
fprintf_­s rsize_­t tmpnam_­s wcsncpy_­s
freopen_­s scanf_­s vfprintf_­s wcsnlen_­s
fscanf_­s set_­constraint_­handler_­s vfscanf_­s wcsrtombs_­s
fwprintf_­s snprintf_­s vfwprintf_­s wcstok_­s
fwscanf_­s snwprintf_­s vfwscanf_­s wcstombs_­s
getenv_­s sprintf_­s vprintf_­s wctomb_­s
gets_­s sscanf_­s vscanf_­s wmemcpy_­s
gmtime_­s strcat_­s vsnprintf_­s wmemmove_­s
ignore_­handler_­s strcpy_­s vsnwprintf_­s wprintf_­s
L_­tmpnam_­s strerror_­s vsprintf_­s wscanf_­s
localtime_­s strerrorlen_­s vsscanf_­s
mbsrtowcs_­s strlen_­s vswprintf_­s

Заголовок не обязательно является исходным файлом, и последовательности, разделенные< и> в именах заголовков, не обязательно являются допустимыми именами исходного файла ([cpp.include]).

Это намеренное , что не существует C ++ заголовок для любого из этих заголовков C: , , .<stdatomic.h><stdnoreturn.h><threads.h>

Это запрещает практику, разрешенную в C, по предоставлению макроса маскировки в дополнение к прототипу функции. Единственный способ добиться эквивалентного встроенного поведения в C ++ - предоставить определение как внешнюю встроенную функцию.

В частности, включение стандартного заголовка<iso646.h> ни на<ciso646> что не влияет.

Эти ".h" заголовки сваливать все свои имена в глобальное пространство имен, в то время как новые формы сохраняют свои имена в пространстве именstd. Следовательно, новые формы являются предпочтительными формами для всех целей, кроме программ C ++, которые предназначены для строгой совместимости с C.

20.5.1.3 Freestanding implementations [compliance]

Определены два типа реализаций: hosted и freestanding ([intro.compliance]). Для размещенной реализации этот международный стандарт описывает набор доступных заголовков.

Автономная реализация имеет набор заголовков, определяемый реализацией. Этот набор должен включать как минимум заголовки, показанные в таблице19.

Таблица19 - Заголовки C ++ для автономных реализаций
Подпункт Заголовок (ы)
<ciso646>
[support.types] Типы <cstddef>
[support.limits] Свойства реализации <cfloat><limits><climits>
[cstdint] Целочисленные типы <cstdint>
[support.start.term] Начало и завершение <cstdlib>
[support.dynamic] Динамическое управление памятью <new>
[support.rtti] Идентификация типа <typeinfo>
[support.exception] Обработка исключений <exception>
[support.initlist] Списки инициализаторов <initializer_­list>
[support.runtime] Другая поддержка во время выполнения <cstdarg>
[meta] Типовые черты <type_­traits>
[atomics] Атомика <atomic>
[depr.cstdalign.syn],[depr.cstdbool.syn] Устаревшие заголовки <cstdalign><cstdbool>

Прилагаемая версия заголовка объявляет , по меньшей мере функции , , , , и ( ). Остальные заголовки, перечисленные в этой таблице, должны соответствовать тем же требованиям, что и для размещенной реализации.<cstdlib> abortatexitat_­quick_­exitexitquick_­exit [support.start.term]