2015-02-16 22 views
5

Rozumiem różnicę między deklaracją a definicją Kiedy zadawałem sobie pytanie, ćwiczyłem pewne pytanie, poniższy kod poprosił mnie o wypisanie błędu we fragmencie.Błąd redeclaracji

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

Dlaczego to powoduje błąd ponownego zgłoszenia a? nie powinna dać wiele definicji a ponieważ:

  • f(int a,int b) - TUTAJ a definiuje prawo?
  • i w treści funkcji, int a jest zdefiniowany ponownie?

Dlaczego nie błąd wielokrotnej definicji?

+6

Definicje są również deklaracjami. Błąd wielu deklaracji jest diagnozowany przed sprawdzeniem wielu definicji. –

+0

Lista parametrów deklaruje 'f (int a ...)', następnie deklarujesz 'int a' w ciele - redeclaration ... –

+2

@ DavidC.Rankin I myślę, że pyta, dlaczego komunikat o błędzie mówi "ponownej deklaracji" zamiast "wiele definicji" –

Odpowiedz

5

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.

+2

Cóż, podoba mi się twoja odpowiedź: Oto, co zrozumiałem, popraw mnie jeśli się mylę, Więc mówisz, że deklaracja parametru funkcji jest różna od deklaracji zmiennej lokalnej, więc otrzymujemy ten błąd, tak jak w tym case extern int a; i extern char a; ma różne typy deklaracji –

+0

@RohitSaluja: parametrem funkcji jest * zawsze * definicja. Jest on zadeklarowany w nagłówku funkcji i zainicjowany przez wywołanie funkcji z pewnymi argumentami, tj. Gdy funkcja jest wykonywana, wszystkie parametry zostaną zainicjowane, stąd będą one * zdefiniowane *. Kiedy próbujesz ponownie zdefiniować parametr wewnątrz funkcji, jest on * podobny * do błędu typu confilcting, jak w twoim przykładzie, tak, ale w tym przypadku jest tak dlatego, że parametr i lokalna zmienna są * różnymi rodzajami symboli *, ponieważ są one zdefiniowane w inny sposób. – Mints97

+0

Dlaczego odnosisz się do definicji inicjalizacji, myślę, że obie są różne rzeczy, Inicjalizacja to dostarczanie zmiennej o pewnej wartości, nic więcej:/ –

1

Po zadeklarowaniu zmiennej w kodzie, blok pamięci zostanie przydzielony z tą nazwą zmiennej w zależności od typu danych użytych w deklaracji.

Ale przy próbie redeclare tej samej zmiennej procesor próbuje przydzielić pamięć, która jest już przydzielona o tej samej nazwie.tak jak procesor twarzy niejasności podczas próby dostępu do bloku pamięci z tej nazwy zmiennej kompilator nie pozwalają tej instrukcji, stąd wielokrotne deklaracje nie będzie dozwolone, a dostaniesz błąd w kompilator gcc opowiadania,

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

w kodzie

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

na układ pamięci dwa bloki nie mogą mieć tego samego identit y (nazwa zmiennej), stąd kompilator zgłasza błąd redeclaracji, ponieważ wiele deklaracji nie jest możliwych, gdy zmienna "a" jest redeclared.

+1

Chyba jesteś zdezorientowany między deklaracją a definicją. Jest to definicja, która przydziela pamięć, a nie deklarację. Więcej informacji na temat deklaracji i definicji znajduje się pod tym linkiem (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration). –