Definicja jest zawsze deklaracją. Różnica polega na tym, że definicja daje także to, co deklarujesz jakąś wartość.
W przykładzie, nawiasem mówiąc, to jest tylko błąd ponowna:
f(int a, /* Defines a */
int b)
{
int a; /* Declares a - error! */
a=20; /* initializes a */
return a;
}
Prawdopodobnie oznaczało to zrobić:
f(int a, /* Defines a */
int b)
{
int a = 20; /* Declares and defines a - error! */
return a;
}
Ale w tym przypadku, większość kompilatory również zgłaszać błąd "redeclaration". Na przykład, GCC wyrzuca następujący błąd:
Error: 'a' redeclared as a different kind of symbol
to dlatego a
jest pierwotnie zdefiniowana jako parametr, który różni się od definicji zmiennej wewnątrz zakresu funkcji. Ponieważ kompilator widzi, że ponownie deklarujesz coś, co jest innej "rasy" niż twoja nowa deklaracja, nie obchodzi cię to, czy twoja nielegalna deklaracja jest definicją, czy nie, ponieważ inaczej definiuje "definicję". pod względem parametrów funkcji i funkcji zmiennych lokalnych.
Jednakże, jeśli to zrobić:
int c = 20;
int c = 20;
GCC na przykład rzuca redefinicja błąd, ponieważ oba c
-s są zmienne lokalne funkcji.
Definicje są również deklaracjami. Błąd wielu deklaracji jest diagnozowany przed sprawdzeniem wielu definicji. –
Lista parametrów deklaruje 'f (int a ...)', następnie deklarujesz 'int a' w ciele - redeclaration ... –
@ DavidC.Rankin I myślę, że pyta, dlaczego komunikat o błędzie mówi "ponownej deklaracji" zamiast "wiele definicji" –