#include
Указывает препроцессору, что содержимое заданного файла необходимо обработать так, как если бы оно находилось в исходной программе в той точке, в которой располагается эта директива.
Синтаксис
#include "path-Spec"
#include<path-spec>
Комментарии
Можно организовать константы и определения макросов в включаемые файлы, а затем использовать директивы
#include , чтобы добавить их в любой исходный файл. Включаемые файлы также позволяют внедрять объявления внешних переменных и сложных типов данных. Типы можно определять и именовать только один раз во включаемом файле, созданном с этой целью.
Путь-Spec — это имя файла, которому при необходимости может предшествовать Спецификация каталога. Имя файла должно указывать на существующий файл. Синтаксис инструкции
path-Spec зависит от операционной системы, в которой компилируется программа.
Сведения о том, как ссылаться на сборки в приложении C++, скомпилированном с помощью
, см. в разделе
.
Какая бы из двух форм синтаксиса ни использовалась, вместо директивы подставляется все содержимое указанного включаемого файла. Различие между ними заключается в том, в каком порядке препроцессор ищет файлы заголовков, если путь указан не полностью. В приведенной ниже таблице показывается различие между этими формами синтаксиса.
КОММЕНТАРИИ
| Форма синтаксиса | Действие |
|---|
| Форма в кавычках | Препроцессор ищет включаемые файлы в следующем порядке:
1) в том же каталоге, что и файл, содержащий инструкцию #include .
2) в каталогах открытых в данный момент файлов включения в порядке, в котором они были открыты. Поиск начинается в каталоге родительского включаемого файла, а затем выполняется в каталогах всех включаемых файлов-прародителей.
3) вдоль пути, указанного в каждом параметре компилятора /i .
4) вдоль путей, заданных переменной среды INCLUDE. |
| Форма с угловыми скобками | Препроцессор ищет включаемые файлы в следующем порядке:
1) вдоль пути, указанного в каждом параметре компилятора /i .
2) при компиляции происходит в командной строке по путям, указанным в переменной среды INCLUDE. |
Как только препроцессор найдет файл с заданным именем, поиск останавливается. При заключении полной, неоднозначной спецификации пути для включаемого файла между двойными кавычками ( " " ) препроцессор выполняет поиск только по этой спецификации пути и игнорирует стандартные каталоги.
Если имя файла в двойных кавычках представляет собой неполную спецификацию пути, то препроцессор сначала просматривает каталог "родительского" файла. Родительский файл — это файл, содержащий директиву
#include . Например, если включить файл с именем
file2 в файл с именем
file1, то файл
file1 будет родительским.
Включаемые файлы могут быть "вложенными": Директива
#include может находиться в файле с именем другой директивы
#include . Например,
file2 может включать
файл3. В этом случае
file1 по-прежнему будет родителем
file2, но это будет «бабушке»
файл3.
Если включаемые файлы являются вложенными и при компиляции происходит в командной строке, поиск в каталоге начинается в каталогах родительского файла. Затем он переходит по каталогам всех файлов «бабушке». Таким образом, поиск начинается относительно каталога, в котором находится исходный файл, обрабатываемый в текущий момент. Если файл не найден, Поиск перемещается в каталоги, указанные параметром компилятора
. Наконец, производится поиск в каталогах, указанных в переменной среды INCLUDE.
В среде разработки Visual Studio переменная среды INCLUDE игнорируется. Сведения о том, как задать каталоги, в которых выполняется поиск включаемых файлов и файлов библиотек, см. на
.
В приведенном ниже примере демонстрируется включение файлов с помощью угловых скобок:
CКопировать
#include <stdio.h>
В этом примере в исходную программу добавляется содержимое файла с именем STDIO.H. Угловые скобки приводят препроцессору для поиска в каталогах, заданных переменной среды INCLUDE для STDIO. З, после того, как он выполняет поиск в каталогах, заданных параметром компилятора
/i .
В следующем примере демонстрируется включение файлов, заданных в кавычках:
CКопировать
#include "defs.h"
В этом примере в исходную программу добавляется содержимое файла с именем DEFS.H. Кавычки означают, что препроцессор сначала попытается найти этот файл в каталоге, содержащем родительский исходный файл.
Для включаемых файлов поддерживается до 10 уровней вложения. При обработке вложенного
#include препроцессор сохраняет включающий включаемый файл в исходный исходный файл.
Блок, относящийся только к системам Microsoft
Чтобы найти исходные файлы включаемых, препроцессор сначала выполняет поиск в каталогах, заданных параметром компилятора
/i . Если параметр
/i отсутствует или завершается неудачно, препроцессор использует переменную среды include для поиска включаемых файлов в угловых скобках. Параметр компилятора включить переменную среды и
/i может содержать несколько путей, разделенных точкой с запятой (
;). Если в параметре
/i или в переменной среды include присутствует более одного каталога, препроцессор ищет их в том порядке, в котором они отображаются.
Представим себе следующую команду:
cmdКопировать
CL /ID:\MSVC\INCLUDE MYPROG.C
Она дает препроцессору указание просмотреть папку D:\MSVC\INCLUDE\ и найти в ней включаемые файлы (например, STDIO.H). Ниже еще один пример:
cmdКопировать
SET INCLUDE=D:\MSVC\INCLUDE
CL MYPROG.C
Эта инструкция действуют точно так же. Если найти файл в обоих наборах каталогов не удастся, возникает неустранимая ошибка компилятора.
Если имя включаемого файла определено полностью, включая путь с двоеточием (например, F:\MSVC\SPECIAL\INCL\TEST.H), то препроцессор проходит по этому пути.
Для включаемых файлов, указанных как #include "path-spec" , поиск по каталогу начинается с каталога родительского файла, а затем продолжается через каталоги всех файлов с именем "бабушке". Это значит, что поиск начинается относительно каталога, содержащего исходный файл, содержащий обрабатываемую директиву
#include . Если у файла нет прародителей, а включаемый файл найти не удалось, то поиск продолжается так, как если бы его имя было заключено в угловые скобки.