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


Директива #include (C/C++)

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

#include   "path-spec" 
#include   <path-spec>

Заметки

Определения констант и макросов можно объединить во включаемые файлы, а затем добавить их в исходный файл при помощи директивы #include. Включаемые файлы также позволяют внедрять объявления внешних переменных и сложных типов данных. Типы можно определять и именовать только один раз во включаемом файле, созданном с этой целью.

Параметр path-spec означает имя файла, перед которым может находиться спецификация каталога (необязательно). Имя файла должно указывать на существующий файл. Синтаксис параметра path-spec зависит от того, в какой операционной системе компилируется программа.

Сведения о том, как ссылаться на сборки в приложении С++, компилируемом с параметром /clr, см. в разделе #using.

Какая бы из двух форм синтаксиса ни использовалась, вместо директивы подставляется все содержимое указанного включаемого файла. Различие между ними заключается в том, в каком порядке препроцессор ищет файлы заголовков, если путь указан не полностью. В приведенной ниже таблице показывается различие между этими формами синтаксиса.

Форма синтаксиса

Действие

Форма в кавычках

Препроцессор ищет включаемые файлы в следующем порядке:

  1. В том же каталоге, где находится файл с оператором #include.

  2. В каталогах открытых в данный момент включаемых файлов (в порядке, обратном тому, в котором они открывались). Поиск начинается в каталоге родительского включаемого файла, а затем выполняется в каталогах всех включаемых файлов-прародителей.

  3. По путям, заданным всеми параметрами компилятора /I.

  4. По путям, заданным в переменной среды INCLUDE.

Форма с угловыми скобками

Препроцессор ищет включаемые файлы в следующем порядке:

  1. По путям, заданным всеми параметрами компилятора /I.

  2. Если компиляция выполняется из командной строки — по путям, которые заданы в переменной среды INCLUDE.

Как только препроцессор найдет файл с заданным именем, поиск останавливается. Если путь к включаемому файлу задан полностью и однозначно и окружен двойными кавычками (" "), то препроцессор ищет файл только по заданному пути, а стандартные каталоги пропускает.

Если имя файла в двойных кавычках представляет собой неполную спецификацию пути, то препроцессор сначала просматривает каталог "родительского" файла. Родительский файл — это файл, содержащий директиву #include. Например, если файл file2 включен в файл file1, то родительским файлом будет считаться file1.

Включаемые файлы могут быть вложенными, т. е. директива #include может использоваться в файле, который указан другой директивой #include. Например, файл file2 может включать file3. В этом случае файл file1 останется родительским файлом для file2, однако для file3 он будет уже "прародителем".

Если используются вложенные файлы и компиляция выполняется из командной строки, то поиск начинается с каталогов родительских файлов, а затем выполняется в каталогах всех файлов-прародителей. Таким образом, поиск начинается относительно каталога, в котором находится исходный файл, обрабатываемый в текущий момент. Если файл не найден, поиск перемещается в каталоги, заданные параметром компилятора /I. Наконец, производится поиск в каталогах, указанных в переменной среды INCLUDE.

Если компиляция выполняется в среде разработки, то переменная среды INCLUDE игнорируется. Дополнительные сведения о том, как задать каталоги для писка включаемых файлов (это относится также к переменной среды LIB), см. в разделе VC++ Directories, Projects, Options Dialog Box.

В приведенном ниже примере демонстрируется включение файлов с помощью угловых скобок:

#include <stdio.h>

В этом примере в исходную программу добавляется содержимое файла с именем STDIO.H. Угловые скобки указывают препроцессору, что файл STDIO.H необходимо искать сначала в каталогах, заданных в параметре компилятора /I, а затем — заданных в переменной среды INCLUDE.

В следующем примере демонстрируется включение файлов, заданных в кавычках:

#include "defs.h"

В этом примере в исходную программу добавляется содержимое файла с именем DEFS.H. Кавычки означают, что препроцессор сначала попытается найти этот файл в каталоге, содержащем родительский исходный файл.

Для включаемых файлов поддерживается до 10 уровней вложения. Когда вложенная директива #include будет обработана, препроцессор продолжит вставлять все окружающие ее включаемые файлы в оригинальный исходный файл.

Блок, относящийся только к системам Microsoft

Чтобы найти включаемые исходные файлы, препроцессор сначала просматривает каталоги, заданные параметром компилятора /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

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

Если имя включаемого файла определено полностью, включая путь с двоеточием (например, F:\MSVC\SPECIAL\INCL\TEST.H), то препроцессор проходит по этому пути.

Если включаемый файл задан директивой #include "path-spec", то поиск начинается с каталога родительского файла, а затем выполняется в каталогах всех файлов-прародителей. Таким образом, поиск начинается относительно каталога, в котором находится исходный файл с обрабатываемой директивой #include. Если у файла нет прародителей, а включаемый файл найти не удалось, то поиск продолжается так, как если бы его имя было заключено в угловые скобки.

Завершение блока, относящегося только к системам Microsoft

См. также

Ссылки

Директивы препроцессора