Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Многие языки программирования и другие компьютерные файлы имеют директиву , часто называемую include(иногда copyили import), которая заставляет содержимое второго файла вставлять в исходный файл. Эти включенные файлы называются тетрадями илизаголовочный файл s . Они часто используются для определения физического макета данных программы, фрагментов процедурного кода и / илипредварительных объявлений, одновременно способствуя инкапсуляции и повторному использованию кода.

Цель [ править ]

includeДиректива позволяет библиотеки кода , которые будут разработаны , которые помогают:

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

Пример ситуации, в которой использование директивы include выгодно, - это обращение к функциям в другом файле. Предположим, у нас есть функция addв одном файле, которая затем объявляется (с прототипом функции ) и затем упоминается во втором исходном файле следующим образом:

интервал  добавления ( интервал ,  интервал );int  тройной ( int  x ) {  return  add ( x ,  add ( x ,  x )); }

Одним из недостатков этого метода является то, что прототип должен присутствовать во всех файлах, использующих функцию. Еще один недостаток заключается в том, что при изменении типа возвращаемого значения или аргументов функции эти прототипы придется обновить. Помещение прототипа в один отдельный файл позволяет избежать этих проблем. Предполагая, что прототип перемещен в файл add.h, второй исходный файл может стать следующим:

#include  "add.h"int  тройной ( int  x ) {  return  add ( x ,  add ( x , x )); }

Теперь каждый раз, когда код компилируется, последние прототипы функций add.hбудут включены в файлы, использующие их, чтобы избежать потенциально катастрофических ошибок.

Языковая поддержка [ править ]

C / C ++ [ править ]

В C и C ++ , то #include директива препроцессора заставляет компилятор заменить эту строку с полным текстом содержания названного исходного файла (если они включены в кавычках: «») или имя заголовок (если включено в угловых скобках: <>); [1] обратите внимание, что заголовок не обязательно должен быть исходным файлом. [2] Включение продолжается рекурсивно для этого включенного содержимого до предела вложенности, определенного реализацией. Заголовки не обязательно должны иметь имена, соответствующие файлам: в стандартных заголовках C ++ обычно используются слова, такие как «вектор», следовательно, в #include <vector>то время как в стандартных заголовках C есть идентификаторы в виде имен файлов с расширением «.h», как в#include <stdio.h>. «Исходным файлом» может быть любой файл с именем любой формы, но чаще всего он имеет расширение «.h» и называется «файл заголовка» (иногда «.hpp» или «.hh», чтобы отличить C ++ заголовки), хотя файлы с расширениями .c, .cc и .cpp также могут быть включены (особенно в методе Single Compilation Unit ), а иногда используются другие расширения.

Эти две формы #includeдиректив могут определять, какой заголовок или исходный файл включать способом, определяемым реализацией. На практике обычно используется форма угловых скобок для поиска исходных файлов в стандартном системном каталоге (или наборе каталогов), а затем поиск исходных файлов по локальным или специфическим для проекта путям (указанным в командной строке, в переменной среды или в Makefile или другом файле сборки), в то время как форма с кавычками не выполняет поиск в стандартном системном каталоге, а выполняет поиск только по локальным или специфическим для проекта путям. [3]В случае отсутствия противоречий форму угловых скобок также можно использовать для указания включений для конкретного проекта, но это считается плохой формой. Тот факт, что заголовки не обязательно должны соответствовать файлам, является в первую очередь технической особенностью реализации и используется для исключения расширения .h при включении стандартных заголовков C ++; в обычном использовании «заголовок» означает «заголовочный файл».

Например:

#include  <stdio.h>  // Включаем содержимое стандартного заголовка 'stdio.h' (возможно, файл 'stdio.h').#include  <vector>  // Включаем содержимое стандартного заголовка vector (возможно, файл vector.h).#include  "user_defined.h"  // Включаем содержимое файла user_defined.h.

В C и C ++ проблемы могут возникнуть, если два (или более) включаемых файла по очереди включают один и тот же третий файл. Одно из решений - избегать включения любых других файлов в включаемые файлы, что может потребовать от программиста вручную добавить дополнительные директивы include в исходный файл. Другое решение - использовать включенные охранники . [4]

КОБОЛ [ править ]

COBOL (а также RPG IV ) позволяет программистам копировать тетради в исходный код программы аналогично файлам заголовков, но также позволяет заменять в них определенный текст другим текстом. Ключевое слово COBOL для включения есть COPY, а замена выполняется с помощью этого REPLACING ... BY ...предложения. Директива include присутствовала в COBOL с COBOL 60, но была изменена с оригинала INCLUDE[5] на COPY1968 год. [6]

Фортран [ править ]

Фортран не требует файлов заголовков как таковых . Однако Fortran 90 и более поздние версии имеют две связанные функции: includeоператоры и модули. Первый может использоваться для совместного использования общего файла, содержащего интерфейсы процедур, во многом как заголовок C, хотя спецификация интерфейса не требуется для всех разновидностей процедур Fortran. Этот подход обычно не используется; вместо этого процедуры обычно группируются в модули, на которые затем можно ссылаться с помощьюuseзаявление в других областях кода. Для модулей информация интерфейса типа заголовка автоматически генерируется компилятором и обычно помещается в отдельные файлы модулей, хотя некоторые компиляторы помещают эту информацию непосредственно в объектные файлы. Сама спецификация языка не требует создания каких-либо дополнительных файлов, даже несмотря на то, что интерфейсы процедур модуля почти повсеместно распространяются таким образом.

Паскаль [ править ]

Большинство компиляторов Pascal поддерживают директиву компилятора $ior $include, в которой директива $ior $includeследует сразу за началом блока комментариев в виде

  • {$i filename.pas}
  • (*$I filename.inc*)
  • {$include filename.inc}
  • (*INCLUDE filename.pas*)

Если в директиве $iили регистр$include не учитывается , а filename.pas или filename.inc - это имя включаемого файла. (Обычной практикой было называть включаемые файлы паскаль с расширением .inc, но это не обязательно.) Некоторые компиляторы, чтобы предотвратить рекурсию черепка , ограничивают вызов включаемого файла определенным числом, запрещают вызов самого себя или любого открытого в данный момент файла, или ограничено максимум одним включаемым файлом за раз, например включаемый файл не может включать в себя сам или другой файл, однако программа, которая включает другие файлы, может включать в себя несколько, только по одному за раз.

PHP [ править ]

В PHP , то includeдиректива вызывает другой PHP файл , который будет включена и оцененным. [7] Аналогичные команды require, которые при неудачном включении вызовут фатальное исключение и остановят скрипт, [8] и include_onceи require_once, которые заставляют файл не включаться или не требуются снова, если он уже был включен или требовался, избегая Проблема двойного включения C.

Другие языки [ править ]

Есть много форм директивы include, например:

  • #include ...( С )
  • include ...( Фортран , MASM )
  • <!--#include ... -->(HTML SSI )
  • import ...;( Java )
  • import ... from ...( JavaScript как в ECMAScript )
  • var ... = require("...")(JavaScript с CommonJS )
  • <%@ include ... %>( JSP )
  • {$I ...}( UCSD Паскаль , Турбо Паскаль )
  • %include ...( PL / I )
  • import ...( Python )
  • /COPY QCPYLESRC,QBC (RPG IV - первый аргумент - имя файла, второй аргумент - тетрадь)
  • use ...;( Ржавчина )

Современные языки (например, Haskell и Java ), как правило, избегают тетрадей или включений, отдавая предпочтение модулям и системам импорта / экспорта для управления пространством имен . Некоторые из этих языков (например, Java и C # ) не используют форвардные объявления, и вместо этого идентификаторы распознаются автоматически из исходных файлов и считываются непосредственно из символов динамической библиотеки (обычно на которые ссылаются директивы importили using), то есть файлы заголовков не нужны.

См. Также [ править ]

  • Подпрограмма
  • источник (команда) и точка (Unix)
  • Включение
  • Модульное программирование
  • Включить уязвимость
  • Серверные компоненты (SSI)
  • Удаленное включение файлов
  • Правило одного определения (ODR)
  • Интерфейс прикладного программирования (API)
  • Язык определения интерфейса (IDL)
  • #pragma once
  • Файл реализации класса
  • Только заголовок
  • Сборка Unity

Ссылки [ править ]

  1. ^ Стандарт C11, 6.10.2 Включение исходного файла, стр. 164–165
  2. ^ Стандарт C11, 7.1.2 Стандартные заголовки, стр. 181, сноска 182: «Заголовок не обязательно является исходным файлом,<а>последовательности с разделителямиив именах заголовков не обязательно являются допустимыми именами исходного файла.
  3. ^ Столмен, Ричард М. (июль 1992 г.). «Препроцессор Си» (PDF) . Архивировано из оригинального (PDF) 4 сентября 2012 года . Проверено 19 февраля 2014 .
  4. Пайк, Роб (21 февраля 1989 г.), Заметки о программировании на C , архив документов Cat-v , получено 9 декабря 2011 г.
  5. ^ «Начальные спецификации COBOL для общего бизнес-ориентированного языка» (PDF) . Министерство обороны . Апрель 1960. с. IX-9. Архивировано из оригинального (PDF) 12 февраля 2014 года . Проверено 11 февраля 2014 .
  6. ^ "Заявление КОПИИ". CODASYL COBOL Журнал развития 1968 . Июль 1969 г. LCCN 73601243 . 
  7. ^ "включить" . php.net . Группа PHP . Проверено 20 февраля 2014 года .
  8. ^ "требовать" . php.net . Группа PHP . Проверено 20 февраля 2014 года .

Внешние ссылки [ править ]

  • Организация файлов кода (потенциальные ошибки и рекомендации по использованию файлов заголовков в C ++)
  • Правила включения файла заголовка C ++