Поделиться через


Использование заголовков библиотеки C++

Чтобы включить содержимое стандартного заголовка, необходимо указать его рядом с директивой include.

#include <iostream>// include I/O facilities

Вы можете включать стандартные заголовки в любом порядке — вы можете включить несколько стандартных заголовков или два или более стандартных заголовка, которые определяют один и тот же макрос или один и тот же тип. Не включайте стандартный заголовок в объявление. Не определяйте макросы с теми же именами, что и ключевые слова, прежде чем включать стандартный заголовок.

Заголовок библиотеки C++ включает все остальные заголовки библиотеки C++ для определения необходимых типов. (Всегда включать явным образом любые заголовки библиотекИ C++, необходимые в единице перевода, однако, если вы угадаете неправильно о его фактических зависимостях.) Стандартный заголовок C никогда не включает другой стандартный заголовок. Стандартный заголовок объявляет и определяет только сущности, описанные для него в этом документе.

Каждая функция в библиотеке объявляется в стандартном заголовке. В отличие от стандартного языка C стандартный заголовок никогда не предоставляет маскирование макроса с тем же именем по аналогии с функцией, которая маскирует объявление функции и позволяет добиться того же эффекта. Дополнительные сведения о маскировании макросов см. в разделе Соглашения библиотеки C++.

Все имена, отличные от operator delete и operator new, в заголовках библиотеки C++ определяются в пространстве имен std или в пространстве имен, которое вложено в пространство имен std. Вы ссылаетесь на имя cin, например std::cin. Обратите внимание, что имена макросов не подлежат квалификации пространства имен, поэтому вы всегда записываете __STD_COMPLEX без квалификатора пространства имен.

В некоторых средах перевода включение заголовка библиотеки C++ может привести к добавлению внешних имен, объявленных в пространстве имен std, в глобальное пространство имен с индивидуальными объявлениями using для каждого из таких имен. В противном случае заголовок не содержит никаких имен библиотек в текущее пространство имен.

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

  • Чтобы гарантированно объявить в пространстве std имен внешнее имя, которое традиционно объявлено в <stdlib.h>, например, включает заголовок <cstdlib>. Помнить, что имена также могут быть объявлены в глобальном пространстве имен.

  • Чтобы гарантированно объявить в глобальном пространстве имен внешнее имя, объявленное в <stdlib.h>, добавьте заголовок <stdlib.h> напрямую. Помнить, что имена также могут быть объявлены в пространстве имен std.

Таким образом, если вы хотите std::abort вызвать ненормальное завершение, следует включить <cstdlib>. Если вы хотите вызвать abort, следует включить <stdlib.h>.

Также можно написать объявление:

using namespace std;

которое переводит все имена библиотек в текущее пространство имен. Если разместить это объявление сразу после всех директив include, вы расширите имена в глобальное пространство имен. В оставшейся части записи блока преобразования пространства имен можно не учитывать. Вы также сможете избежать большинства различий между различными средами преобразования.

Если явно не указано иначе, вы не можете определять в своей программе имена в пространстве имен std или пространстве имен, вложенном в пространство имен std.

См. также

Общие сведения о стандартной библиотеке C++
Потокобезопасность в стандартной библиотеке C++