stringtranslate.com

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

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

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

В программировании , заголовочный файл - это файл, который позволяет программистам разделять определенные элементы исходного кода программы на повторно используемые файлы. Заголовочные файлы обычно содержат предварительные объявления классов , подпрограмм , переменных и других идентификаторов . Программисты, которые хотят объявить стандартизированные идентификаторы в более чем одном исходном файле, могут поместить такие идентификаторы в один заголовочный файл, который другой код затем может включать всякий раз, когда требуется содержимое заголовка. Это делается для того, чтобы интерфейс в заголовке был отделен от реализации . [ 1]

Стандартная библиотека C и стандартная библиотека C++ традиционно объявляют свои стандартные функции в заголовочных файлах.

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

Цель

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

Пример

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

целое добавить ( целое , целое );  int triple ( int x ) { return add ( x , add ( x , x )); }      

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

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

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

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

С/С++

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

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

Например:

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

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

Начиная с C++20 , заголовки также могут быть импортированы как заголовочные единицы , то есть отдельные единицы трансляции, синтезированные из заголовка. [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 ) стремятся избегать тетрадей или включений, предпочитая модули и системы импорта/экспорта для управления пространством имен . Некоторые из этих языков (например, Java и C# ) не используют опережающие объявления, а вместо этого идентификаторы автоматически распознаются из исходных файлов и считываются напрямую из динамических библиотечных символов (обычно ссылающихся с помощью директив importили using), что означает, что заголовочные файлы не нужны.

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

Ссылки

  1. ^ Алан Гриффитс (2005). "Разделение интерфейса и реализации в C++". ACCU . Получено 2013-05-07 .
  2. ^ Стандарт C11, 6.10.2 Включение исходного файла, стр. 164–165
  3. ^ Стандарт C11, 7.1.2 Стандартные заголовки, стр. 181, сноска 182: «Заголовок не обязательно является исходным файлом, равно как и последовательности, разделенные <и >в именах заголовков, не обязательно являются допустимыми именами исходных файлов».
  4. ^ Столлман, Ричард М. (июль 1992 г.). "Препроцессор C" (PDF) . Архивировано из оригинала (PDF) 4 сентября 2012 г. . Получено 19 февраля 2014 г. .
  5. Пайк, Роб (21 февраля 1989 г.), Заметки о программировании на языке C, архив документов Cat-v , получено 9 декабря 2011 г.
  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 г. .

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