stringtranslate.com

Включить директиву

Директива include дает команду процессору текстовых файлов заменить текст директивы содержимым указанного файла.

Акт включения может быть логическим по своей природе. Процессор может просто обработать содержимое файла включения в месте расположения директивы, не создавая объединенный файл.

Различные процессоры могут использовать разный синтаксис. Препроцессор C (используемый с C , C++ и в других контекстах) определяет директиву include как строку, которая начинается #includeи сопровождается спецификацией файла. COBOL определяет директиву include , обозначенную как copyдля включения тетради .

Обычно для C/C++ директива include используется для включения заголовочного файла , но может включать любой файл. Хотя это встречается относительно редко, иногда она используется для включения файла тела, например, файла .c.

Директива include может поддерживать инкапсуляцию и повторное использование . Различные части системы могут быть разделены на логические группы, но при этом полагаться друг на друга посредством включения файлов. C и C++ разработаны для использования include, а также для оптимизации времени сборки за счет разрешения объявления отдельно от реализации . Включенная информация может быть сведена только к объявлениям.

Поскольку многие считают, что включение содержимого файла имеет существенные недостатки, новые языки были разработаны без директивы include. Такие языки, как Java и C#, поддерживают модуляризацию с помощью концепции импорта , которая позволяет модулю использовать активы другого модуля на концептуальном уровне; а не путем включения текста.

Языковая поддержка

С/С++

Как C, так и C++ обычно используются с препроцессором C, который заменяет #includeстроку директивы содержимым указанного файла. Путь к файлу заключается либо в двойные кавычки (например, "xyz.h"), либо в угловые скобки (например, <xyz.h>). [1] Некоторые препроцессоры по-разному находят включаемый файл в зависимости от заключающих его разделителей; рассматривая путь в двойных кавычках как относительный к включаемому файлу, а путь в угловых скобках — как расположенный в одном из каталогов настроенного системного пути поиска. [2]

Примеры включают в себя утверждения:

// включить стандартный заголовок C 'stdio.h'; вероятно, это файл с таким именем #include <stdio.h> // включить стандартный заголовок C++ 'vector'; может быть файлом, а может и не быть #include <vector> // включить пользовательский заголовочный файл с именем 'user_defined.h' #include "user_defined.h"    

Директива include позволяет разрабатывать библиотеки кода , которые:

Пример

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

int add ( int , int ); int triple ( int x ) { return add ( x , add ( x , x )); }         

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

#include "add.h" int triple ( int x ) { return add ( x , add ( x , x )); }       

Заголовочный файл

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

Заголовочный файл объявляет элементы программирования, такие как функции , классы , переменные и макросы препроцессора . Заголовочный файл позволяет программисту использовать элементы программирования в нескольких файлах тела на основе общего объявления в заголовочном файле. Объявления в заголовочном файле позволяют файлам тела использовать реализации без непосредственного включения кода реализации. Заголовок отделяет интерфейс от реализации . [ 3]

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

Стандартная библиотека C объявлена ​​как набор заголовочных файлов. Стандартная библиотека C++ похожа, но объявления могут быть предоставлены компилятором без чтения фактического файла.

Стандартные заголовочные файлы C именуются с .h расширением имени файла , например #include <stdio.h>. Обычно пользовательские заголовочные файлы C имеют такое же расширение. Пользовательские заголовочные файлы C++, как правило, имеют большее разнообразие расширений, включая .hpp, .h++и .hh.

Имя стандартной библиотеки C++ в угловых скобках (например, <vector>) приводит к включению объявлений, но они могут быть не из файла. [5]

Заголовочный блок

Начиная с C++20 , C++ поддерживает семантику импорта через заголовочный блок , то есть отдельные блоки трансляции, синтезированные из заголовка. [6] Они предназначены для использования вместе с модулями . Синтаксис, используемый в этом случае, следующий:

экспорт необязательно импорт имени заголовка;

Пример:

import < stdio.h > ; // поддержка этого необязательна import <vector> ; // поддержка этого обязательна по стандарту export import " user_defined.h " ;      

Заголовочные модули предусмотрены для всех заголовков стандартной библиотеки C++. [7]

КОБОЛ

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

Фортран

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

Паскаль

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

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

PHP

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

Другие языки

Другие известные языки с директивой include:

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

Смотрите также

Ссылки

  1. ^ Стандарт C11, 6.10.2 Включение исходного файла, стр. 164–165
  2. ^ Столлман, Ричард М. (июль 1992 г.). "Препроцессор C" (PDF) . Архивировано из оригинала (PDF) 4 сентября 2012 г. . Получено 19 февраля 2014 г. .
  3. ^ Алан Гриффитс (2005). "Разделение интерфейса и реализации в C++". ACCU . Получено 2013-05-07 .
  4. Пайк, Роб (21 февраля 1989 г.), Заметки о программировании на языке C, архив документов Cat-v , получено 9 декабря 2011 г.
  5. ^ Стандарт C11, 7.1.2 Стандартные заголовки, стр. 181, сноска 182: «Заголовок не обязательно является исходным файлом, равно как и последовательности, разделенные <и >в именах заголовков, не обязательно являются допустимыми именами исходных файлов».
  6. ^ «Объединение модулей - P1103R3» (PDF) .
  7. ^ "P1502R1 - Стандартные заголовочные модули библиотеки для C++20".
  8. ^ "COBOL Initial Specifications for a COmmon Business Oriented Language" (PDF) . Министерство обороны . Апрель 1960 г. стр. IX-9. Архивировано из оригинала (PDF) 12 февраля 2014 г. . Получено 11 февраля 2014 г.
  9. ^ "Заявление COPY". CODASYL COBOL Journal of Development 1968. Июль 1969. LCCN  73601243.
  10. ^ "include". php.net . PHP Group . Получено 20 февраля 2014 г. .
  11. ^ "require". php.net . PHP Group . Получено 20 февраля 2014 г. .

Внешние ссылки