2013-06-01 13 views
6

Według Wikipedii:Zewnętrzna zmienna znajdująca się w funkcji?

http://en.wikipedia.org/wiki/External_variable

Zmienna zewnętrzna może być również uznane wewnątrz funkcji.

Jaki jest cel deklaracji zmiennej zewnętrznej w funkcji? Czy to też musi być statyczne?

+0

te posty są powiązane: http://stackoverflow.com/questions/16459422/why-does-declaring-an-extern-variable-inside-main-works-but- nie-definiując-it-in i http://stackoverflow.com/questions/9686198/what-is-the-use-of-declaring-a-static-variable-as-extern-inside-a-function – taocp

Odpowiedz

2

Jedyna różnica między deklarowania zmiennej zewnętrznej w zakresie przestrzeni nazw:

extern int x; 

void foo() { 
    cout << x; 
} 

i deklarowania go na zakres funkcji:

void foo() { 
    extern int x; 
    cout << x; 
} 

to w tym ostatnim przypadku x jest tylko widoczny wewnątrz funkcji.

Wszystko, co robisz, jeszcze bardziej zaostrza zakres deklaracji extern.


Oto analogiczny przykład za pomocą nazw:

At zakresie przestrzeni nazw:

#include <string> 
using std::string; 

void foo() { 
    string str1; 
} 

string str2; // OK 

W zakresie funkcji:

#include <string> 
void foo() { 
    using std::string; 
    string str1; 
} 

string str2; // Error - `using` not performed at this scope 
1

Zewnętrzna deklaracja wchodzi do funkcji. Oznacza to po prostu, że żadna inna funkcja nie może zobaczyć zmiennej.

void func() 
{ 
    extern int foo; 
    foo ++; 
} 


void func2() 
{ 
    foo--;  // ERROR: undeclared variable. 
} 

W innym pliku źródłowego:

int foo;  // Global variable. Used in the other source file, 
      // but only in `func`. 

To jest po prostu sposobem na „izolować” zmienną, więc nie przypadkowo przyzwyczaić w miejscach, gdzie nie ma być stosowane.

+0

I don Nie rozumiem, jak to się różni od zwykłej zmiennej lokalnej ... W jaki sposób 'extern' czyni to inaczej? – 0x499602D2

+0

@ 0x499602D2 'extern' mówi kompilatorowi 'ta zmienna jest zdefiniowana gdzieś indziej.' W rzeczywistości nic nie definiuje, po prostu deklaruje. –

+0

@ 0x499602D2: Nie definiuje zmiennej; to oznacza, że ​​istnieje gdzie indziej. Dlatego nie jest wcale "lokalny". –

4

Pozwala to na ograniczenie dostępu do globalnej w pewnym zakresie:

int main() 
{ 
    extern int x; 
    x = 42; //OKAY 
} 

void foo() 
{ 
    x = 42; //ERROR 
} 

int x; 
0

tekst odnosi się do niearomatycznego -defin o deklaracja zmiennej zewnętrznej zmiennej wewnątrz funkcji. Zewnętrzne definicje wewnętrzne funkcje są niedozwolone.

Zatem nieokreślona deklaracja zewnętrznej zmiennej wewnątrz funkcji oznacza po prostu, że chcemy użyć tej zmiennej wewnątrz tej funkcji. Sama zmienna musi być zmienną globalną zdefiniowaną gdzie indziej.

Zasadniczo, jeśli nie potrzebujesz dostępu do tej zmiennej globalnej (zdefiniowanej gdzie indziej) w całej jednostce tłumaczeniowej i po prostu potrzebujesz jej wewnątrz tej funkcji, dobrze jest ją zadeklarować lokalnie.W ten sposób nie zanieczyszczasz globalnej przestrzeni nazw za pomocą identyfikatorów, których żadna inna funkcja nie potrzebuje.

+0

Jeśli nie można jej użyć nigdzie indziej - czy można argumentować, że może to być lokalna zmienna statyczna? Czy istnieje różnica? – user997112

+0

@ user997112: Nie jestem pewien, co masz na myśli przez "nie można go użyć nigdzie indziej". W rzeczywistości sama zmienna * może * być używana absolutnie wszędzie. (W końcu jest to zmienna globalna.) Po prostu będzie wymagać oddzielnej deklaracji również w innych miejscach. – AnT

+0

W powyższej odpowiedzi wygląda na to, że zmienna nie może być używana poza funkcją, z której jest zewnętrznie zadeklarowana? – user997112

0

Słowo kluczowe extern mówi, że identyfikator ma powiązanie zewnętrzne. Oznacza to, że jest on powiązany z tą samą nazwą w innym miejscu, w którym został zadeklarowany z zewnętrznym powiązaniem. Oznacza to, że różne wystąpienia nazwy w różnych miejscach odnoszą się do tego samego obiektu.

Zgłoszenie identyfikatora wewnątrz bloku (łącznie z blokiem, który definiuje funkcję) nadaje zakresowi bloku. Zakres tej instancji identyfikatora kończy się na końcu bloku.

Kombinacja extern z zakresem bloku pozwala funkcji zobaczyć zewnętrzny identyfikator bez zaśmiecania przestrzeni nazw innych funkcji. (Niemniej jednak często jest to zła praktyka.)

Powiązane problemy