Объявление (информатика)
В языках программирования объявле́ние (англ. 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
или блок инструкций BEGIN
… END
) и касается объектов, доступных в данном блоке. Язык имеет весьма расширенный синтаксис атрибутов и расширенный механизм подстановки атрибутов и неявных объявлений.
Пример: 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;
begin
…
end;
Turbo Pascal
Объявление, предваряющее саму функцию, применяют так же, как и в Паскале. В Турбо Паскале объявления указывают также в модулях (собственное расширение Турбо Паскаля по отношению к Паскалю) в разделе interface
.
{ Turbo Pascal }
unit Пример;
interface
{ объявление функции, доступной в других модулях и программах }
function trunc(x : real): integer;
implementation
{ определение объявленной выше функции
так как параметры и возвращаемое значение были определены в объявлении,
то функции в разделе interface не требуется их повторения }
function trunc;
begin
…