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