Una definizione è sempre una dichiarazione. La differenza è che una definizione dà anche qualsiasi cosa dichiari qualche valore.
Nel tuo esempio, tra l'altro, si è solo un errore di ridichiarazione:
f(int a, /* Defines a */
int b)
{
int a; /* Declares a - error! */
a=20; /* initializes a */
return a;
}
Probabilmente destinato a fare questo:
f(int a, /* Defines a */
int b)
{
int a = 20; /* Declares and defines a - error! */
return a;
}
Ma in questo caso, la maggior parte dei compilatori lancia anche un errore di "redeclaration". Ad esempio, GCC genera il seguente errore:
Error: 'a' redeclared as a different kind of symbol
Questo perché a
è originariamente definito come un parametro, che è differente da una definizione variabile all'interno portata della funzione. Come il compilatore vede che tu sei riaffermando qualcosa che è di una "razza" diversa dalla tua nuova dichiarazione, non può importare di meno se la tua dichiarazione illegale è una definizione o meno, perché riguarda "definizione" in modo diverso in termini di parametri funzionali e variabili locali della funzione.
Tuttavia, se si esegue questa operazione:
int c = 20;
int c = 20;
GCC, per esempio, getta una ridefinizione errore , perché entrambe le c
-s sono variabili locali della funzione.
Le definizioni sono anche dichiarazioni. L'errore di dichiarazione multipla viene diagnosticato prima di verificare la presenza di più definizioni –
L'elenco dei parametri dichiara 'f (int a ...)', quindi dichiari 'int a' nel corpo - redeclaration ... –
@ DavidC.Rankin I pensa che stia chiedendo perché il messaggio di errore dice "re-declaration" invece di "multiple definition" –