stringtranslate.com

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

В программировании декларация это языковая конструкция , определяющая свойства идентификатора : она объявляет значение слова (идентификатора). [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 ).

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

Примечания

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

Ссылки

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

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