Декларация (компьютерное программирование)
![]() | Эту статью может потребовать очистки Википедии , чтобы она соответствовала стандартам качества . Конкретная проблема заключается в следующем: слишком много примеров неясной релевантности; недостаточно ссылок; проблемные упоминания о файлах заголовков и множественных объявлениях. ( декабрь 2013 г. ) |
В компьютерном программировании объявление — это языковая конструкция, определяющая свойства идентификатора : она объявляет значение слова (идентификатора). [1] Объявления чаще всего используются для функций , переменных , констант и классов , но также могут использоваться и для других сущностей, таких как перечисления и определения типов. [1] Помимо имени (сам идентификатор) и типа объекта (функция, переменная и т. д.), в объявлениях обычно указывается тип данных (для переменных и констант) или сигнатура типа (для функций); типы могут также включать измерения, например, для массивов . Объявление используется для объявления о существовании объекта компилятору ; это важно в тех строго типизированных языках, которые требуют, чтобы функции, переменные и константы, а также их типы были указаны в объявлении перед использованием, и используется в предварительном объявлении . [2] Термин «декларация» часто противопоставляется термину «определение». [1] но значение и использование значительно различаются в зависимости от языка; см. ниже.
Объявления особенно заметны в языках традиции ALGOL , включая семейство BCPL , особенно в C и C++ , а также в Pascal . В Java используется термин «объявление», хотя Java не требует отдельных объявлений и определений.
Декларация против определения [ править ]
Одна из основных дихотомий заключается в том, содержит ли объявление определение: например, в объявлении переменной или константы указано ее значение или только ее тип; и аналогично, указывает ли объявление функции тело ( реализацию ) функции или только ее сигнатуру типа. [1] Не все языки проводят это различие: во многих языках объявления всегда включают определение и могут называться либо «объявлениями», либо «определениями», в зависимости от языка. [а] Однако эти понятия различаются в языках, требующих объявления перед использованием (для которых используются предварительные объявления), и в языках, где интерфейс и реализация разделены: интерфейс содержит объявления, реализация содержит определения. [б]
В неофициальном использовании «объявление» относится только к чистому объявлению (только типы, без значения или тела), тогда как «определение» относится к объявлению, которое включает значение или тело. Однако в формальном использовании (в спецификациях языка) «объявление» включает в себя оба этих значения с более тонкими различиями в зависимости от языка: в C и C++ объявление функции, не включающее тело, называется прототипом функции , а объявление функции, которая включает тело, называется «определением функции». В Java объявления встречаются в двух формах. Для общедоступных методов они могут быть представлены в интерфейсах как сигнатуры методов, которые состоят из имен методов, типов ввода и типа вывода. Аналогичные обозначения можно использовать и в определении абстрактных методов , не содержащих определения. Можно создать экземпляр включающего класса, вместо этого для создания экземпляра класса потребуется создать новый производный класс, который обеспечивает определение метода. Начиная с Java 8 , в язык было включено лямбда-выражение, которое можно было рассматривать как объявление функции.
Декларации и определения [ править ]
В языке программирования C-семейства объявления часто собираются в файлы заголовков , которые включаются в другие исходные файлы, которые ссылаются на эти объявления и используют их, но не имеют доступа к определению. Информация в файле заголовка обеспечивает интерфейс между кодом, использующим объявление, и кодом, который его определяет, — это форма сокрытия информации . Объявление часто используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотеке . Несоответствие между типом определения и типом объявления приводит к ошибке компилятора.
Что касается переменных, определения присваивают значения области памяти, которая была зарезервирована на этапе объявления. Для функций определения предоставляют тело функции. Хотя переменная или функция может быть объявлена много раз, обычно она определяется один раз (в C++ это известно как правило одного определения или ODR).
Динамические языки, такие как JavaScript или Python, обычно позволяют переопределять функции, то есть перепривязывать их ; Функция — это переменная, как и любая другая, с именем и значением (определением).
Вот несколько примеров объявлений, которые не являются определениями в C:
extern char example1;
extern int example2;
void example3(void);
Вот несколько примеров объявлений, которые являются определениями, опять же на языке C:
char example1; /* Outside of a function definition it will be initialized to zero. */
int example2 = 5;
void example3(void) { /* definition between braces */ }
Неопределенные переменные [ править ]
В некоторых языках программирования неявное объявление предоставляется при первом обнаружении такой переменной во время компиляции . В других языках такое использование считается ошибкой, которая может привести к выдаче диагностического сообщения. Некоторые языки изначально использовали неявное объявление, но по мере развития они предоставляли возможность его отключения (например, в Perl " use strict
" или Visual Basic " Option Explicit
").
См. также [ править ]
Примечания [ править ]
- ^ Например, Java использует «объявление» (объявление класса, объявление метода), а Python использует «определение» (определение класса, определение функции). [3]
- ^ Это различие наблюдается в «единицах» (модулях) Паскаля, а также в традиционной организации кода C и C++, в которой есть файлы заголовков, состоящие в основном из чистых объявлений, и исходные файлы, состоящие из определений, хотя это не всегда строго соблюдается и не применяется. по языку.
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б с д «Объявление определяет интерпретацию и атрибуты набора идентификаторов. Определение идентификатора — это объявление для этого идентификатора, которое:
- для объекта [переменная или константа] вызывает резервирование памяти для этого объекта;
- для функции включает тело функции;
- для константы перечисления — это (единственное) объявление идентификатора;
- для имени typedef — это первое (или единственное) объявление идентификатора».
- ^ Майк Банахан. «2.5. Объявление переменных» . ГБдирект . Проверено 8 июня 2011 г.
Объявление [A] [...] вводит только имя и тип чего-либо, но не выделяет памяти[...].
- ^ 7. Составные операторы , Справочник по языку Python.
Внешние ссылки [ править ]
- Объявлять и определять в C и C++ , Алекс Аллен
- 8.2. Декларации, определения и доступность , Книга C, GBdirect
- Декларации и определения (C++) , MSDN
- «Объявления сообщают компилятору, что элемент или имя программы существует. Определения указывают, какой код или данные описывает это имя».