В программировании декларация — это языковая конструкция , определяющая свойства идентификатора : она объявляет значение слова (идентификатора). [1] Декларации чаще всего используются для функций , переменных , констант и классов , но также могут использоваться для других сущностей, таких как перечисления и определения типов. [1] Помимо имени (самого идентификатора) и вида сущности (функция, переменная и т. д.), декларации обычно указывают тип данных (для переменных и констант) или сигнатуру типа (для функций); типы могут также включать измерения, например, для массивов . Декларация используется для объявления существования сущности компилятору ; это важно в тех строго типизированных языках, которые требуют, чтобы функции, переменные и константы, а также их типы были указаны с помощью декларации перед использованием, и используется в предварительном объявлении . [2] Термин «декларация» часто противопоставляется термину «определение», [1] но значение и использование значительно различаются в разных языках; см. ниже.
Декларации особенно заметны в языках в традиции ALGOL , включая семейство BCPL , наиболее заметны C и C++ , а также Pascal . Java использует термин «декларация», хотя Java не требует отдельных деклараций и определений.
Одна из основных дихотомий заключается в том, содержит ли объявление определение: например, указывает ли объявление переменной или константы ее значение или только ее тип; и аналогично указывает ли объявление функции тело ( реализацию ) функции или только ее сигнатуру типа. [1] Не все языки делают это различие: во многих языках объявления всегда включают определение и могут называться либо «объявлениями», либо «определениями», в зависимости от языка. [a] Однако эти концепции различаются в языках, которые требуют объявления перед использованием (для которых используются опережающие объявления), и в языках, где интерфейс и реализация разделены: интерфейс содержит объявления, реализация содержит определения. [b]
В неформальном использовании «декларация» относится только к чистой декларации (только типы, без значения или тела), в то время как «определение» относится к декларации, которая включает значение или тело. Однако в формальном использовании (в спецификациях языка) «декларация» включает в себя оба этих смысла, с более тонкими различиями по языку: в C и C++ декларация функции, которая не включает тело, называется прототипом функции , в то время как декларация функции, которая включает тело, называется «определением функции». В Java декларации встречаются в двух формах. Для публичных методов они могут быть представлены в интерфейсах как сигнатуры методов, которые состоят из имен методов, входных типов и выходного типа. Подобная нотация может использоваться в определении абстрактных методов , которые не содержат определения. Включающий класс может быть инстанцирован, вместо этого для создания экземпляра класса потребуется создать новый производный класс, который предоставляет определение метода . Начиная с Java 8 , в язык было включено лямбда-выражение, которое можно рассматривать как объявление функции.
В семействе языков программирования C декларации часто собираются в заголовочные файлы , которые включаются в другие исходные файлы, которые ссылаются на эти декларации и используют их, но не имеют доступа к определению. Информация в заголовочном файле обеспечивает интерфейс между кодом, который использует декларацию, и тем, который ее определяет, что является формой сокрытия информации . Декларация часто используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотеке . Несоответствие между типом определения и типом декларации приводит к ошибке компилятора.
Для переменных определения присваивают значения области памяти, которая была зарезервирована во время фазы объявления. Для функций определения предоставляют тело функции. Хотя переменная или функция может быть объявлена много раз, обычно она определяется один раз (в C++ это известно как Правило одного определения или ODR).
Динамические языки, такие как JavaScript или Python, обычно позволяют переопределять функции, то есть повторно привязывать их ; функция — это переменная, как и любая другая, имеющая имя и значение (определение).
Вот несколько примеров объявлений, которые не являются определениями, в языке C:
extern char example1 ; extern int example2 ; void example3 ( void );
Вот несколько примеров объявлений, которые являются определениями, снова на языке C:
char example1 ; /* За пределами определения функции он будет инициализирован нулем. */ int example2 = 5 ; void example3 ( void ) { /* определение в фигурных скобках */ }
В некоторых языках программирования неявное объявление предоставляется в первый раз, когда такая переменная встречается во время компиляции . В других языках такое использование считается ошибкой, которая может привести к диагностическому сообщению. Некоторые языки изначально имели неявное поведение объявления, но по мере развития они предоставили возможность отключить его (например, " " в Perluse strict
или " " в Visual BasicOption Explicit
).
[A] объявление [...] вводит только имя и тип чего-либо, но не выделяет память [...].