Объявление (информатика)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

В языках программирования объявление (англ. declaration) включает в себя указание идентификатора, типа, а также других аспектов элементов языка, например, переменных и функций. Объявление используется, чтобы уведомить компилятор о существовании элемента; это весьма важно для многих языков (например, таких как Си), требующих объявления переменных перед их использованием.

Обзор[править | править исходный текст]

В семействе языков BCPL, представителями которого являются C++ и Java, также можно указывать размер переменной при объявлении скалярного типа, массива или матрицы. В этом семействе объявления (уведомление о существовании и свойствах элемента) и определения (definitions) (обеспечивающие непосредственно саму реализацию) могут указываться независимо друг от друга. Объявления, в общем случае, указываются в заголовочных файлах, которые затем подключаются в других файлах, ссылающихся на них, для использования этих объявлений, но у них нет доступа к определению. Если определение типа не совпадает с ранее указанным объявлением этого элемента, то в этом случае компилятор выдает сообщение об ошибке.

Для переменных определения присваивают значения областям памяти, зарезервированным при объявлении. Для функций определения обеспечивают описание самого тела функции. При том, что переменная или функция могут объявляться много раз, как правило они определяются лишь один раз. Хотя, динамические языки, как например Javascript или Python, допускают переопределение функций.

Объявление, зачастую, используется для того, чтобы получить доступ к функции или переменной, определённым в другом исходном файле или библиотеке.

Ниже приведено несколько примеров использования объявлений в языке Си, не являющихся определениями:

extern char example1;
extern int example2;
void example3(void);

А теперь несколько примеров определений на языке Си:

char example1;
int example2 = 5;
void example3(void)
{
 int x = 7;
}

Элементы, определяемые в объявлении[править | править исходный текст]

В различных языках программирования требования, касающиеся объявления определённых программных объектов могут сильно различаться. В общем случае объявлению могут подвергаться следующие параметры:

В программировании, иногда, от объявления отличают определение, применительно к таким элементам как:

  • типы,
  • константы,
  • литералы,
  • подпрограммы,
  • классы,

причём, объявление и определение могут объединяться или указываться отдельно в различных местах исходного кода (вплоть до разных файлов).

Место объявления[править | править исходный текст]

Объявление в исходном коде как правило должны предшествовать первому употреблению данного идентификатора в программе. Объявление представляет собой информацию для транслятора, которая сама по себе не генерирует исполняемого кода (но зачастую приводит к выделению памяти).

Синтаксис большинства языков программирования предусматривает указание объявления в определённом месте исходного кода. Это или специальная секция программы (модуля, подпрограммы, пакета), или начало определённого блока (то есть все объявления должны быть в тексте программы перед первой инструкцией данного блока).

Виды объявлений[править | править исходный текст]

Объявление может быть:

  • неявным,
  • явным:
    • полным или
    • частичным.
Неявное объявление

Неявные объявления используются в языках программирования, которые допускают употребление идентификатора без его явного объявления. В этом случае транслятор должен иметь механизм добавления к идентификатору атрибутов на основании определённых методов:

  • по умолчанию,
  • неявно,
  • исходя из контекста.

Неявные объявления могут приводить к ошибкам, например, буквенная ошибка в идентификаторе станет причиной новой переменной, тем самым возникнет ошибка в действии программы.

Явное объявление

Явные декларации могут быть полными или частичными. Частичные объявления могут применяться в случаях:

  • несимметричная структура атрибутов (например, в объявлении указание атрибута EXTERNAL может обозначать внешний объект (переменную, процедуру и т. п.), определённый в другом модуле, а отсутствие его указания будет означать внутренний объект (описываемый данным объявлением в данном модуле), причём, отсутствие явного указания атрибута возможно будет противоположно для EXTERNAL (например, INTERNAL);
  • механизм подстановки атрибутов применяют здесь схожие принципы дополняния атрибутов с методами для неявных объявлений (например, могут существовать атрибуты EXTERNAL и INTERNAL, причём, отсутствие явного указания противоположного атрибута для какого-либо из них, будет обозначать указание одного из их, например, INTERNAL).

Примеры объявлений в языках[править | править исходный текст]

Объявления переменных[править | править исходный текст]

Объявление переменной может содержать помимо самого объявления также инициализацию переменной, то есть указание первоначального значения переменной.

Си, C++[править | править исходный текст]

Объявления указываются:

  • вне функции, класса, метода для глобальных переменных;
  • в начале блока инструкций { } для локальных переменных;
  • как выражение в последующих частях блока инструкций {} для локальных переменных (не для языка Си).
  int global_var;
  main()
   {
     int y;
     ...
     {
        int z=1;
        getch();
        int x=5; /*не работает для языка Си*/
        ...
     }
     ...
   }

Паскаль[править | править исходный текст]

Объявления указываются в программе или её подпрограмме в спецификации блока, располагающемся между заголовком (программы, процедуры, функции, модуля (Турбо Паскаль)) и словом, обозначающим начало группы инструкции данного блока (begin).

  program Пример;
    var globar_var;
    ...
    procedure Licz();
      var local_var;
    begin
 
    end; {procedure}
  begin
 
  end. {program}

ПЛ/1[править | править исходный текст]

Объявление имеет вид инструкции DECLARE (или сокращенно DCL) и может быть указано в любом месте внутри блока (в ПЛ/1 таким блоком является или процедура от заголовка PROCEDURE до слова END или блок инструкций BEGINEND) и касается объектов, доступных в данном блоке. Язык имеет весьма расширенный синтаксис атрибутов и расширенный механизм подстановки атрибутов и неявных объявлений.

  Пример: PROC;
    ...
    /* Используем переменную X, объявленную далее */
    X=1;
    ...
    /* объявление в блоке может указываться при употреблении идентификатора но
       объявленная переменная должна быть доступна в начале блока */
    DCL X FIXED DECIMAL(5,0);
    ...
  END Пример;

Объявления меток[править | править исходный текст]

  {Pascal}
  program DclLabel;
    label Метка;begin
    …
    Метка:;goto Метка;end.

Объявление модулей[править | править исходный текст]

Turbo Pascal[править | править исходный текст]

  program DclUnit;
    uses Crt, Graph, MyUnit;
    ...
  begin
    ...
     Write('Процедура использует модуль Crt');
    ...
  end.

Модула-2[править | править исходный текст]

  MODULE DclUnit;
    FROM InOut IMPORT
      Read, Write, ...;
    ...
    Write('Процедура использует модуль InOut');
    ...
  END DclUnit.

Объявления функций[править | править исходный текст]

Си, C++[править | править исходный текст]

В языках C, C++ объявление функций (также называется прототипом) обычно помещается в файлы заголовков, определяющих конкретные модули.

  /* прототип функции trunc */
  int trunc(double x);

Паскаль[править | править исходный текст]

Объявление функций применяется, когда функция должна быть вызвана, а не когда определяется.

  { Pascal }
  procedure Proc_1; forward;
  procedure Proc_2;
  begin{''Вызов процедуры, которая ещё не была определена,''
      ''требует объявления''}
     Proc_1;end;{ Последующее определение процедуры }
  procedure Proc_1;
  beginend;

Turbo Pascal[править | править исходный текст]

Объявление, предваряющее саму функцию, применяют так же, как и в Паскале. В Турбо Паскале объявления указывают также в модулях (собственное расширение Турбо Паскаля по отношению к Паскалю) в разделе interface.

  { Turbo Pascal }
  unit Пример;
  interface
    { объявление функции, доступной в других модулях и программах }
    function trunc(x : real): integer;
  implementation
    { определение объявленной выше функции
      так как параметры и возвращаемое значение были определены в объявлении,
      то функции в разделе interface не требуется их повторения }
     function trunc;
     begin

См. также[править | править исходный текст]

Ссылки[править | править исходный текст]