Директива #include указывает, что препроцессор обрабатывает содержимое указанного файла, если это содержимое появилось в программе источника в той точке, где отображается директива.
#include "path-spec"
#include <path-spec>
Можно организовать постоянные и определенные макроса в включаемых файлах, а затем использовать #include для добавления этого определения к любому файлу источника. Подключенные файлы также полезны для включения объявления внешних переменных и сложных типов данных. Необходимо указать только один раз и именования типов в файле include, созданном для этой цели.
путь-спецификации имя файла при необходимости, которому предшествует спецификацией каталога. Имя файла должно иметь имя существующего файла. синтаксис путь-спецификации зависит от операционной системы, в которой программа компилирована.
Обе формы синтаксиса вызывают замену, т.е. эти директивы включают все содержание подключенного файла. Разница между двумя формами, в которых препроцессор выполняет поиск файлов заголовков, когда путь неполностью определен. В таблице приведены различия между 2 форм синтаксиса:
Форма синтаксиса | Действие |
кавычки "" | Поиск препроцессора, включает файлы в следующем порядке: 1. В том же каталоге, что и файл, содержащий #include. 2. В каталогах ранее открытых всех включаемых файлов в обратном порядке, в котором они были открыты. Поиск начинается от каталога включаемого файла, который был открыт в последний раз, затем продолжает через каталог включаемого файла, который был открыт в первую очередь. 3. Вдоль пути конкретного каждого параметра компилятора /I. 4. Вдоль путей, указанных в переменной среды INCLUDE. |
уголки <> | Поиск препроцессора, включает файлы в следующем порядке: 1. Вдоль пути конкретного каждого параметром компилятора /I. 2. При компилировании в командной строке вдоль путей, указанных в переменной среды INCLUDE. |
Препроцессор прекратит поиск только тогда, когда ему удается найти файл с заданным именем. Если указано full, точно, представленную спецификацию пути для файла включения между двойными кавычками (" "), то спецификация пути будет игнорировать стандартные каталоги.
Если имя файла заключенное в двойные кавычки, то директива сначала ищет «родительский» каталог файлов. Родительский файл содержит директиву #include. Например, если указать файл file2 в файле file1, file1 родительский файл.
Подключенные файлы могут быть вложены, то есть #include директива может появляться в файл с другим именем #include директивы. Например, в file2 подключен file3. В этом случае file1 по-прежнему родитель file2, но стал «дедом» для file3.
Когда включаемые файлы являются вложенными и при компилировании из командной строки поиска каталога начинается с каталогами родительского файла, а затем продолжает в каталогах всех файлов деда. Таким образом, поиск задается относительно каталога, а содержание обрабатывается в момент компилирования. Если файл не найден, поиск перемещает к каталогам указанным параметром компилятора /I. Наконец, будет производиться поиск в каталогах, указанных в переменной среды INCLUDE.
В следующем примере показано включение файлов с помощью угловые скобки:
#include <stdio.h>
Этот пример добавляет содержимое файла с именем STDIO.H к программе. Угловые скобки вызывают поиск препроцессора в каталогах, указанных в переменной среды INCLUDE для STDIO.H.
В следующем примере показано включение файлов с помощью закавыченную форму:
#include "defs.h"
Этот пример добавляет содержимое файла, указанного DEFS.H к программе. Двойные кавычки означают, что препроцессор ищет каталог, содержащий родительский файл источника.
Вложение включаемых файлов может продолжаться до 10 уровней.
Только для систем Microsoft
Чтобы найти includable исходные файлы, препроцессор сначала выполняет поиск в каталогах, указанных параметром компилятора /I. Если параметр /I отсутствует или завершился ошибкой, то препроцессор использует переменную среды INCLUDE, чтобы найти любые включенные файлы в угловые скобки. Переменная среды INCLUDE и параметр компилятора /I могут содержать несколько разделенных точкой с запятой (path;). Если более чем один каталог появляется как часть параметра /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 "путь-спецификации", поиск каталогов начинается с каталога родительского файла, а затем продолжает в каталогах всех файлов деда. Таким образом, начинается поиск по отношению к каталогу. Если файл деда и файл не найден, то поиск продолжается, если имя файла заключено в угловые скобки.