Deklarace a definice (C++)
Deklarace oznamují kompilátoru, že existuje prvek programu nebo název.Definice určují, jaký kód nebo data tento název popisuje.Název musí být před jeho použitím deklarován.
Deklarace
Deklarace do programu zavádí jeden nebo více názvů.Deklarace se v programu mohou vyskytnout více než jednou.Proto mohou být třídy, struktury a jiné uživatelem definované typy deklarovány pro každou jednotku kompilace.Omezení této vícenásobné deklarace je, že všechny deklarace musí být identické.Deklarace také slouží jako definice, kromě případů, kdy deklarace:
Je prototyp funkce (deklarace funkce bez těla funkce).
Obsahuje specifikátor extern, ale žádný inicializátor (objektů a proměnných) nebo tělo funkce (funkcí).To označuje, že definice není pro aktuální jednotku převodu nutná a umožňuje externí propojení názvu.
Je statickým datovým členem uvnitř deklarace třídy.
Protože datové členy statické třídy jsou samostatné proměnné sdílené všemi objekty třídy, musí být definovány a inicializovány mimo deklaraci třídy. (Další informace o třídách a členech tříd naleznete v tématu Třídy.)
Je deklarace názvu třídy bez následující definice, jako je class T;.
Je příkaz typedef.
Deklarace, které jsou také definicemi jsou například:
// Declare and define int variables i and j.
int i;
int j = 10;
// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };
// Declare class CheckBox.
class CheckBox : public Control
{
public:
Boolean IsChecked();
virtual int ChangeState() = 0;
};
Některé deklarace, které nejsou definicemi jsou:
extern int i;
char *strchr( const char *Str, const char Target );
Definice
Definice je jedinečná specifikace objektu nebo proměnné, funkce, třídy nebo výčtu.Vzhledem k tomu, že definice musí být jedinečné, program může obsahovat pouze jednu definici pro daný prvek programu.Mezi deklaracemi a definicemi může existovat shoda více k jedné.Existují dva případy, ve kterých může být prvek programu deklarován a ne definován:
Funkce je deklarována, ale nikdy není odkázána pomocí volání funkce nebo výrazu, který přijímá adresu této funkce.
Třída je použita pouze způsobem, který nevyžaduje znát její definici.Avšak třída musí být deklarována.Následující kód ukazuje takový případ:
// definitions.cpp class WindowCounter; // Forward reference; no definition class Window { // Definition of WindowCounter not required static WindowCounter windowCounter; }; int main() { }