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


#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 (Дополнительные каталоги включения)