2016-12-29 83 views
5

W C++ deklarowanie zmiennej wiele razy pokazuje błąd podczas kompilacji. Na przykład:Deklarowanie funkcji i zmiennych wiele razy w C++

int x; 
int x; 

Deklaracja funkcji wiele razy nie pokazuje żadnego błędu podczas kompilacji. Na przykład:

int add(int, int); 
int add(int, int); 

Dlaczego to rozróżnienie w C++?

+0

Funkcja może być przeciążona, ale liczba i typy parametrów powinny być różne. Zmienne nie mogą być przeciążone. – nischalinn

+0

To nie przeciąża tylko jego redeclaracji. deklarację można sporządzić w dowolnym momencie. – user1438832

+0

to nie deklaracja funkcji, to deklaracja prototypu, która może być wykonana wiele razy. To jest rozróżnienie, ponieważ C faktycznie. Prototyp to deklaracja bez treści, deklaracja ORAZ treść uznana za definicję, która może wystąpić tylko raz. – Swift

Odpowiedz

12

Należy pamiętać, że int x; nie jest (tylko) declaration, jest to definition. Tak więc błąd powstały od ODR jest naruszony, tj. Tylko jedna definicja jest dozwolona w jednej jednostce tłumaczeniowej.

Deklaracja zmiennej może być zapisany jako:

// a declaration with an extern storage class specifier and without an initializer 
extern int x; 
extern int x; 

W międzyczasie int add(int, int); jest deklaracja (funkcji) dokładnie. Wiele deklaracji w jednej jednostce tłumaczeniowej jest w porządku, ODR nie jest naruszana.

+1

Możesz chcieć kontynuować i wyjaśnić, że deklaracja 'int add (int int)' nie jest definicją, więc ODR nie ma zastosowania. – Peter

+0

Dzięki za wyjaśnienie! To odpowiada na moje wątpliwości. :) –

+0

Warto zauważyć, że przekazywanie deklaracji funkcji w nagłówkach jest niezwykle ważne dla zarządzania zależnościami (zasadniczo mówiąc: "można założyć, że w czasie połączenia powinna istnieć funkcja z tym podpisem"). Ta deklaracja forward może łatwo prowadzić do duplikatów, jeśli uwzględnione zostaną różne nagłówki z tą samą deklaracją. Jednak zduplikowana definicja zmiennych oznacza 2 różne wystąpienia czegoś o tej samej nazwie i brak możliwości ich rozróżnienia. (Dlatego nie jest dozwolone.) –