Многие языки программирования и другие компьютерные файлы имеют директива, часто называемая include
(иногда copy
или import
), что приводит к вставке содержимого второго файла в исходный файл. Эти включенные файлы называются тетрадями или заголовочными файлами . Они часто используются для определения физического макета данных программы, фрагментов процедурного кода и / или предварительных объявлений при продвижении инкапсуляции и повторного использования кода.
Директива include
позволяет разрабатывать библиотеки кода, которые помогают в:
Пример ситуации, в которой использование директивы include выигрывает, - это обращение к функциям в другом файле. Предположим, у нас есть функция add
в одном файле, которая затем объявляется (с прототипом функции ) и затем упоминается во втором исходном файле следующим образом:
int add ( int, int); int тройной (int x) {return add (x, add (x, x)); }
Одним из недостатков этого метода является то, что прототип должен присутствовать во всех файлах, использующих функцию. Еще один недостаток заключается в том, что при изменении типа возвращаемого значения или аргументов функции эти прототипы придется обновить. Помещение прототипа в один отдельный файл позволяет избежать этих проблем. Предполагая, что прототип перемещен в файл add.h
, второй исходный файл может стать:
#include "add.h" int triple (int x) {return add (x, add ( х, х)); }
Теперь, каждый раз, когда код компилируется, последние прототипы функций из add.h
будут включены в файлы, использующие их, чтобы избежать потенциально катастрофических ошибок.
В C и C ++ #include
директива препроцессора заставляет компилятор заменять эту строку полным текстом содержимого указанного исходного файла (если он включен в кавычки: "") или именованного заголовка (если включен в угловые скобки : <>); обратите внимание, что заголовок не обязательно должен быть исходным файлом. Включение продолжается рекурсивно для этого включенного содержимого до предела вложенности, определенного реализацией. Заголовки не обязательно должны иметь имена, соответствующие файлам: в стандартных заголовках C ++ обычно используются слова, такие как «вектор», поэтому #include
, тогда как в стандартных заголовках C есть идентификаторы в виде имен файлов с Расширение ".h", как в #include
. «Исходным файлом» может быть любой файл с именем любой формы, но чаще всего он имеет расширение «.h» и называется «заголовочный файл» (иногда «.hpp» или «.hh», чтобы отличить C ++ заголовки), хотя файлы с расширениями.c,.cc и.cpp также могут быть включены (особенно в методе Single Compilation Unit ), и иногда используются другие расширения.
Эти две формы директивы #include
могут определять, какой заголовок или исходный файл включать, способом, определяемым реализацией. На практике обычно используется форма угловых скобок для поиска исходных файлов в стандартном системном каталоге (или наборе каталогов), а затем поиск исходных файлов по локальным или специфическим для проекта путям (указанным в командной строке, в переменной среды или в Makefile или другом файле сборки), в то время как форма с кавычками не выполняет поиск в стандартном системном каталоге, а ищет только по локальным или специфическим для проекта путям. В случае отсутствия противоречий форма угловых скобок также может использоваться для указания включений для конкретного проекта, но это считается плохой формой. Тот факт, что заголовки не обязательно должны соответствовать файлам, является в первую очередь технической особенностью реализации и используется для исключения расширения.h при включении стандартных заголовков C ++; в обычном использовании «заголовок» означает «заголовочный файл».
Например:
#include// Включаем содержимое стандартного заголовка 'stdio.h' (возможно, файл 'stdio.h'). #include // Включаем содержимое стандартного заголовка vector (возможно, файл vector.h). #include "user_defined.h" // Включаем содержимое файла user_defined.h.
В C и C ++ проблемы могут возникнуть, если два (или более) включаемых файла по очереди включают один и тот же третий файл. Одно из решений - избегать включения любых других файлов в включаемые файлы, что может потребовать от программиста вручную добавить дополнительные директивы включения в исходный файл. Другое решение - использовать include guards.
COBOL (а также RPG IV ), что позволяет программистам копировать тетради в исходный код программы аналогично заголовку файлы, но также позволяет заменять в них определенный текст другим текстом. Ключевое слово COBOL для включения - COPY
, а замена выполняется с помощью предложения REPLACING... BY...
. Директива include присутствовала в COBOL с COBOL 60, но к 1968 году была изменена с исходного INCLUDE
на COPY
.
Fortran поддерживает сами по себе файлы заголовков не требуются. Однако Fortran 90 и более поздние версии имеют две связанные функции: включают в себя
операторы и модули. Первый может использоваться для совместного использования общего файла, содержащего интерфейсы процедур, во многом как заголовок C, хотя спецификация интерфейса не требуется для всех разновидностей процедур Fortran. Этот подход обычно не используется; вместо этого процедуры обычно группируются в модули, на которые затем можно ссылаться с помощью оператора use
в других областях кода. Для модулей информация интерфейса типа заголовка автоматически генерируется компилятором и обычно помещается в отдельные файлы модулей, хотя некоторые компиляторы помещают эту информацию непосредственно в объектные файлы. Сама спецификация языка не требует создания каких-либо дополнительных файлов, хотя интерфейсы процедурных модулей почти повсеместно распространяются таким образом.
В PHP директива include
вызывает включение и оценку другого файла PHP. Аналогичные команды: require
, который при неудачном включении вызовет фатальное исключение и остановит скрипт, и include_once
и require_once
, которые заставляет файл не включаться или не требуется снова, если он уже был включен или требовался, избегая проблемы двойного включения C.
Существует множество форм директивы include, например:
#include...
(C )include...
(Fortran, MASM )
(HTML SSI )импорт...;
(Java )импорт... из...
(JavaScript )var... = require ("...")
(JavaScript)<%@ include... %>
(JSP ){$ I...}
(UCSD Pascal, Turbo Pascal )% include...
(PL / I )import...
(Python )/ COPY QCPYLESRC, QBC
( RPG IV - первый аргумент - имя файла, второй аргумент - тетрадь)extern crate...;
(Rust )Современные языки (например, Haskell и Java ) стараются избегать копий или включений, предпочитая модули и системы импорта / экспорта для управления пространством имен. Некоторые из этих языков (например, Java и C # ) не используют форвардные объявления, и вместо этого идентификаторы распознаются автоматически из исходных файлов и считываются непосредственно из символов динамической библиотеки (обычно указываются с помощью import
или с помощью
directi ves), то есть файлы заголовков не нужны.