stringtranslate.com

Декларация (компьютерное программирование)

В компьютерном программировании объявление — это языковая конструкция , определяющая свойства идентификатора : она объявляет значение слова (идентификатора). [1] Объявления чаще всего используются для функций , переменных , констант и классов , но также могут использоваться и для других сущностей, таких как перечисления и определения типов. [1] Помимо имени (сам идентификатор) и типа объекта (функция, переменная и т. д.), в объявлениях обычно указывается тип данных (для переменных и констант) или сигнатура типа (для функций); типы могут также включать измерения, например, для массивов . Объявление используется для объявления о существовании объекта компилятору ; это важно в тех строго типизированных языках, которые требуют, чтобы функции, переменные и константы, а также их типы были указаны в объявлении перед использованием, и используется в предварительном объявлении . [2] Термин «декларация» часто противопоставляется термину «определение», [1] но значение и использование значительно различаются в зависимости от языка; см. ниже.

Объявления особенно заметны в языках традиции ALGOL , включая семейство BCPL , особенно в C и C++ , а также в Pascal . В Java используется термин «объявление», хотя Java не требует отдельных объявлений и определений.

Декларация против определения

Одна из основных дихотомий заключается в том, содержит ли объявление определение: например, в объявлении переменной или константы указывается ее значение или только ее тип; и аналогично, указывает ли объявление функции тело ( реализацию ) функции или только ее сигнатуру типа. [1] Не все языки проводят это различие: во многих языках объявления всегда включают определение и могут называться либо «объявлениями», либо «определениями», в зависимости от языка. [a] Однако эти понятия различаются в языках, которые требуют объявления перед использованием (для которых используются предварительные объявления), и в языках, где интерфейс и реализация разделены: интерфейс содержит объявления, реализация содержит определения. [б]

В неофициальном использовании «объявление» относится только к чистому объявлению (только типы, без значения или тела), тогда как «определение» относится к объявлению, которое включает значение или тело. Однако в формальном использовании (в спецификациях языка) «объявление» включает в себя оба этих значения с более тонкими различиями в зависимости от языка: в C и C++ объявление функции, не включающее тело, называется прототипом функции , а объявление функции, которая включает тело, называется «определением функции». В Java объявления встречаются в двух формах. Для общедоступных методов они могут быть представлены в интерфейсах как сигнатуры методов, которые состоят из имен методов, типов ввода и типа вывода. Аналогичные обозначения можно использовать и в определении абстрактных методов , не содержащих определения. Можно создать экземпляр включающего класса, вместо этого для создания экземпляра класса потребуется создать новый производный класс, который обеспечивает определение метода. Начиная с Java 8 , в язык было включено лямбда-выражение, которое можно было рассматривать как объявление функции.

Декларации и определения

В языке программирования C-семейства объявления часто собираются в файлы заголовков , которые включаются в другие исходные файлы, которые ссылаются на эти объявления и используют их, но не имеют доступа к определению. Информация в файле заголовка обеспечивает интерфейс между кодом, использующим объявление, и кодом, который его определяет, — это форма сокрытия информации . Объявление часто используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотеке . Несоответствие между типом определения и типом объявления приводит к ошибке компилятора.

Что касается переменных, определения присваивают значения области памяти, которая была зарезервирована на этапе объявления. Для функций определения предоставляют тело функции. Хотя переменная или функция может быть объявлена ​​много раз, обычно она определяется один раз (в C++ это известно как правило одного определения или ODR).

Динамические языки, такие как JavaScript или Python, обычно позволяют переопределять функции, то есть перепривязывать их ; Функция — это переменная, как и любая другая, с именем и значением (определением).

Вот несколько примеров объявлений, которые не являются определениями в C:

внешний символ пример1 ; внешний int пример2 ; недействительный пример3 ( недействительный );     

Вот несколько примеров объявлений, которые являются определениями, опять же на языке C:

пример символа1 ; /* Вне определения функции она будет инициализирована нулем. */ int example2 = 5 ; void example3 ( void ) { /* определение между фигурными скобками */ }         

Неопределенные переменные

В некоторых языках программирования неявное объявление предоставляется при первом обнаружении такой переменной во время компиляции . В других языках такое использование считается ошибкой, которая может привести к выдаче диагностического сообщения. Некоторые языки изначально использовали неявное объявление, но по мере развития они предоставили возможность его отключения (например, " " в Perluse strict или " " в Visual BasicOption Explicit ).

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

Примечания

  1. ^ Например, Java использует «объявление» (объявление класса, объявление метода), а Python использует «определение» (определение класса, определение функции). [3]
  2. ^ Это различие наблюдается в «единицах» (модулях) Паскаля, а также в традиционной организации кода C и C++, в которой есть файлы заголовков , состоящие в основном из чистых объявлений, и исходные файлы, состоящие из определений, хотя это не всегда строго соблюдается и не применяется. по языку.

Рекомендации

  1. ^ abcd «Объявление определяет интерпретацию и атрибуты набора идентификаторов. Определение идентификатора — это объявление для этого идентификатора, которое:
    • для объекта [переменная или константа] вызывает резервирование памяти для этого объекта;
    • для функции включает тело функции;
    • для константы перечисления — это (единственное) объявление идентификатора;
    • для имени typedef — это первое (или единственное) объявление идентификатора».
    Спецификация C11, 6.7: Декларации, параграф 5.
  2. ^ Майк Банахан. «2.5. Объявление переменных». ГБдирект . Проверено 8 июня 2011 г. Объявление [A] [...] вводит только имя и тип чего-либо, но не выделяет памяти[...].
  3. ^ 7. Составные операторы, Справочник по языку Python.

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