Deklarace (programování)

Deklarace je v informatice zápis, kterým se v počítačovém programu zavádí jméno (identifikátor) a zpravidla určuje jeho datový typ a další aspekty pro proměnné, funkce (procedury), konstanty apod. Překladač je tak informován o příslušném objektu. V jazycích se silnou typovou kontrolou, jako je Pascal, C nebo Ada, je nutné všechny objekty deklarovat dříve, než jsou použity v programu.[1]

Deklarace a definice

V některých programovacích jazycích se rozlišuje deklarace a definice. Zatímco v deklaraci se definuje typ deklarované entity, v definici se definuje její obsah (například tělo funkce). V programovacích jazycích typu BCPL jako je C++ a Java, může být při deklaraci zadána také velikost proměnné. Zadání velikosti proměnné se používá k deklaraci vektorů, polí, nebo matic. V této skupině programovacích jazyků mohou být "pravé" deklarace (oznámení o existenci prvku a jeho vlastnostech, tedy jednoduše řečeno "deklarace") a „definice“ (deklarace, které se týkají aktuální implementace, například při deklaraci (definici) funkcí a inicializaci proměnných) vytvářeny nezávisle na sobě.

Deklarace se provádějí především v hlavičkových souborech, které jsou následně vloženy do jiných souborů, které je mohou používat, ale nemají přístup k definicím. Tato struktura umožňuje oddělení rozhraní od implementace. Pokud definovaný typ neodpovídá předchozí deklaraci, překladač ukončí činnost a zahlásí chybu.

V případě proměnných definice přiřazují hodnoty na rezervované místo v paměti během deklarace. V případě funkcí, definice vytvoří její tělo. Zatím co proměnné a funkce mohou být deklarovány mnohokrát za sebou, definovány mohou byt pouze jednou. Dynamické jazyky jako například JavaScript nebo Python umožňují předefinovat funkce.

Deklarace je obvykle používána v případě potřeby přístupu k proměnné, nebo funkci definované v jiném zdrojovém souboru, nebo knihovně.


Příklady deklarace dvou proměnných „priklad1“, „priklad2“ a jedné funkce „priklad3“, které nejsou definicemi. V jazyce C:

extern char priklad1;
extern int priklad2;
void priklad3(void);


Příklad definice proměnných a funkce, opět v jazyce C:

char priklad1 = 'e';
int priklad2 = 5;
void priklad3(void)
{
  int x = 7;
}

Implicitní a Explicitní deklarace

Explicitní deklarace proměnné se zapisuje před jejím vlastním použitím, zpravidla na začátku procedury události. Deklarace začíná obvykle definováním datového typu.

Implicitní deklarace znamená, že proměnnou během deklarace přímo použijeme v programu (viz příklad). Jedná se tedy o deklaraci proměnné „za běhu“. Implicitní deklarace má výhodu rychlejšího zápisu programového kódu.


Příklad explicitní deklarace v jazyce C. Datový typ udává položka „int“ (tedy integer):

int priklad;
priklad = 5;


Příklad implicitní deklarace proměnné „priklad“ v jazyce C. Po vykonání programu bude v proměnné „priklad“ hodnota 5:

int funkce()
{
  return 5;
}
int priklad = funkce();

Proměnné

V některých programovacích jazycích jsou implicitní deklarace vytvořeny při překladu, až když se s nimi překladač poprvé setká. V jiných jazycích je takový postup považovaný za fatální a během diagnostiky je zahlášena chyba. Některé jazyky původně používaly implicitní deklaraci proměnných, ale během jejich vývoje získaly možnost ji vypnout (například v Perlu použitím „use strict“ nebo ve Visual Basicu direktivou Option Explicit“).

Příklady jak různé programovací jazyky reagují na nedefinované proměnné. Pod každou částí kódu je napsáno chybové hlášení (pokud nějaké vznikne):

CLISP (GNU CLISP 2.35)

(setf y x)
*** - EVAL: variable X has no value

C# (.NET Framework)

static void Main()
{
  int y = x;
}
Undefined variable x

C (GNU GCC 3.4)

int main()
{
  int y = x;
  return 0;
}
foo.c: In function `main':
foo.c:2: error: `x' undeclared (first use in this function)
foo.c:2: error: (Each undeclared identifier is reported only once
foo.c:2: error: for each function it appears in.)

JavaScript (Mozilla Firefox 1.0)

  y = x
 Error: x is not defined
 Source File: file:///c:/temp/foo.js

Standard ML (Standard ML of New Jersey v110.55)

 val y = x;
stdIn:1.9 Error: unbound variable or constructor: x

MUMPS (Caché)

 Set Y = X
<UNDEF>

MUMPS (GT.M)

 Set Y=X
%GTM-E-UNDEF, Undefined local variable: X

OCaml 3.08

let y = x;;
Unbound value x

Perl 5.8

my $y = $x;

(žádná chyba)

use strict;
my $y = $x;
Global symbol "$x" requires explicit package name at foo.pl line 2.
Execution of foo.pl aborted due to compilation errors.

PHP 5

$y = $x;

(žádná chyba)

error_reporting(E_ALL);
$y = $x;
PHP Notice: Undefined variable: x in foo.php on line 3

Python

x = y
Traceback (most recent call last):
  File "foo.py", line 1, in ?
    x = y
NameError: name 'y' is not defined

Ruby 1.8

y = x
NameError: undefined local variable or method `x' for main:Object
from (irb):1

VBScript (WSH 5.6)

Dim y
y = x

(žádná chyba)

Option Explicit

Dim y
y = x
(3, 1) Microsoft VBScript runtime error: Variable is undefined: 'x'

Odkazy

Reference

  1. Mike Banahan. 2.5. Declaration of variables [online]. http://publications.gbdirect.co.uk/c_book/: GBdirect [cit. 2011-06-08]. Dostupné online. (anglicky) 

Související články