2015-02-16 17 views
5

Ho compreso la differenza tra la dichiarazione e la definizione E stavo esercitando una domanda quando ho trovato il dubbio, il codice seguente mi ha chiesto di elencare l'errore nello snippet.Errore di ridenominazione

f(int a,int b) 
{ 
    int a; 
    a=20; 
    return a; 
} 

Perché questo dà errori ri-dichiarazione di a? Non dovrebbe dare una definizione multiplo di a perché in:

  • f(int a,int b) - qui a è definito giusto?
  • e nel corpo della funzione, int a viene nuovamente definito?

Allora perché non più errore di definizione?

+6

Le definizioni sono anche dichiarazioni. L'errore di dichiarazione multipla viene diagnosticato prima di verificare la presenza di più definizioni –

+0

L'elenco dei parametri dichiara 'f (int a ...)', quindi dichiari 'int a' nel corpo - redeclaration ... –

+2

@ DavidC.Rankin I pensa che stia chiedendo perché il messaggio di errore dice "re-declaration" invece di "multiple definition" –

risposta

5

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.

+2

Beh, mi piace la tua risposta, ecco cosa ho capito correggermi se ho torto, quindi stai dicendo che la dichiarazione del parametro della funzione è diversa dalla dichiarazione della variabile locale quindi otteniamo questo errore proprio come in questo caso extern int a; e extern char a; ha i diversi tipi di dichiarazione –

+0

@RohitSaluja: un parametro di una funzione è * sempre * una definizione. Viene dichiarato nell'intestazione della funzione e inizializzato chiamando la funzione con alcuni argomenti, vale a dire quando la funzione viene eseguita, tutti i parametri verranno inizializzati, quindi saranno * definiti *. Quando provi a ridefinire un parametro all'interno di una funzione, è * sorta di * simile a un errore di tipo confilcting come nel tuo esempio, sì, ma in questo caso, è perché un parametro e una variabile locale sono * tipi differenti di simboli * in quanto sono definiti in modo diverso. – Mints97

+0

Perché stai mettendo in relazione la definizione all'inizializzazione, suppongo che siano entrambe le cose diverse, l'inizializzazione sta solo fornendo alla variabile un valore, niente di più:/ –

1

Quando si dichiara una variabile nel codice, un blocco di memoria saranno assegnati con quel nome variabile a seconda del tipo di dati utilizzato nella dichiarazione.

Ma quando si tenta di ridichiarare stessa variabile del processore tenta di allocare la memoria che è già allocato con lo stesso nome.così come il processore faccia ambiguità durante l'accesso al blocco di memoria con quel nome variabile il compilatore non consentono tale istruzione, quindi dichiarazioni multiple non sono ammesse e si otterrà un errore nel compilatore GCC dire,

line 3 col 10 [Error]redeclaration of 'int a' 
line 1 col 7  [Error]'int a' previously declared here 

nel codice

f(int a,int b) //first declaration of 'a' 
    { 
     int a;  //redeclaration of 'a', whose memory is already allocated 
     a=20; 
     return a; 
    } 

sul layout di memoria due blocchi non possono avere lo stesso identit y (nome variabile), quindi il compilatore genera un errore di ridenominazione in quanto non sono possibili più dichiarazioni, quando la variabile 'a' viene dichiarata nuovamente.

+1

Immagino che tu sia confuso tra dichiarazione e definizione. È la definizione che alloca la memoria e non la dichiarazione. Per maggiori informazioni su dichiarazione e definizione segui questo [link] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration). –