В компьютерном программировании , декларация является языковой конструкцией , которая определяет свойство идентификатора : он объявляет , что слово (идентификатор) «означает». [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 ( недействительно );
Вот несколько примеров объявлений, которые являются определениями, снова в C:
char example1 ; / * Вне определения функции она будет инициализирована нулем. * / int example2 = 5 ; void example3 ( void ) { / * определение в фигурных скобках * / }
Неопределенные переменные
В некоторых языках программирования неявное объявление предоставляется при первом обнаружении такой переменной во время компиляции . На других языках такое использование считается ошибкой, которая может привести к диагностическому сообщению. Некоторые языки начали с неявного описания поведения, но по мере развития они предоставили возможность отключить его (например, Perl " use strict
" или Visual Basic " Option Explicit
").
Смотрите также
Заметки
- ^ Например, Java использует «объявление» (объявление класса, объявление метода), а Python использует «определение» (определение класса, определение функции). [3]
- ^ Это различие наблюдается в «единицах» (модулях) Паскаля и в обычной организации кода C и C ++, в которой есть файлы заголовков, состоящие в основном из чистых объявлений, и исходные файлы, состоящие из определений, хотя это не всегда строго соблюдается и не применяется. по языку.
Рекомендации
- ^ a b c d "Объявление определяет интерпретацию и атрибуты набора идентификаторов. Определение идентификатора - это объявление для этого идентификатора, которое:
- для объекта [переменной или константы] вызывает резервирование памяти для этого объекта;
- для функции включает тело функции;
- для константы перечисления - это (единственное) объявление идентификатора;
- для имени typedef - первое (или единственное) объявление идентификатора. "
- ^ Майк Banahan. «2.5. Объявление переменных» . http://publications.gbdirect.co.uk/c_book/ : GBdirect . Проверено 8 июня 2011 .
[A] объявление [...] вводит только имя и тип чего-либо, но не выделяет памяти [...].
- ^ 7. Составные операторы , Справочник по языку Python
Внешние ссылки
- Declare vs Define в C и C ++ , Алекс Аллен
- 8.2. Декларации, определения и доступность , Книга C, GBdirect
- Объявления и определения (C ++) , MSDN
- «Объявления сообщают компилятору, что элемент или имя программы существует. Определения указывают, какой код или данные описывает это имя».