2013-06-01 13 views
6

Secondo wikipedia:Una variabile esterna situata in una funzione?

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

Una variabile esterna può anche essere dichiarato all'interno di una funzione.

Qual è lo scopo di una variabile esterna dichiarata all'interno di una funzione? Dovrebbe essere anche statico?

+0

questi post sono correlati: http://stackoverflow.com/questions/16459422/why-does-declaring-an-extern-variable-inside-main-works-but- non definendo-it-in e http://stackoverflow.com/questions/9686198/questo-è-del-uso-del-declaring-a-static-variable-as-extern-inside-a-function – taocp

risposta

2

L'unica differenza tra la dichiarazione di una variabile esterna a perimetro namespace:

extern int x; 

void foo() { 
    cout << x; 
} 

e dichiari a perimetro funzione:

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

è che in quest'ultimo caso, x è solo visibile all'interno della funzione.

Tutto ciò che si sta facendo è stringere ulteriormente la portata della dichiarazione extern.


Ecco un esempio analogo utilizzando namespace:

a portata namespace:

#include <string> 
using std::string; 

void foo() { 
    string str1; 
} 

string str2; // OK 

A perimetro funzione:

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

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

La dichiarazione esterna passa all'interno di una funzione. Significa semplicemente che nessun'altra funzione può vedere la variabile.

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


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

In un altro file sorgente:

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

E 'solo un modo per "isolare" una variabile, in modo che non venga accidentalmente utilizzato in luoghi dove non si suppone da essere usato.

+0

I don ottenere come questo è diverso da una variabile locale regolare ... Come fa 'extern' renderlo diverso? – 0x499602D2

+0

@ 0x499602D2 'extern' dice al compilatore 'questa variabile è definita da qualche altra parte.' In realtà non definisce nulla, semplicemente dichiara. –

+0

@ 0x499602D2: non definisce una variabile; dichiara _ uno che esiste altrove. Quindi non è affatto "locale". –

4

Esso consente di limitare l'accesso ad un globale certo margine:

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

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

int x; 
0

Il testo si riferisce ad un non -defin ing dichiarazione di una variabile esterna all'interno della funzione. Extern definizioni all'interno delle funzioni sono illegali.

Quindi, una dichiarazione non definita di una variabile esterna all'interno della funzione indica semplicemente che si desidera utilizzare quella variabile all'interno di tale funzione. La variabile stessa deve essere una variabile globale definita altrove.

In sostanza, se non è necessario accedere a tale variabile globale (definita altrove) nell'intera unità di traduzione e averne solo bisogno all'interno di tale funzione, è una buona idea dichiararla localmente.In questo modo non stai inquinando lo spazio dei nomi globale con identificatori di cui nessun'altra funzione ha bisogno.

+0

Se non può essere utilizzato da nessun'altra parte, si potrebbe sostenere che potrebbe anche essere una variabile statica locale? C'è una differenza? – user997112

+0

@ user997112: Non sono sicuro di cosa intendi con "non può essere utilizzato da nessun'altra parte". In realtà, la variabile stessa * può * essere usata assolutamente ovunque. (Dopo tutto è una variabile globale). È solo che richiederà una dichiarazione separata anche in altri luoghi. – AnT

+0

Nella risposta sopra sembra che la variabile non possa essere utilizzata al di fuori della funzione in cui è dichiarata esternamente? – user997112

0

La parola chiave extern indica che un identificatore ha un collegamento esterno. Ciò significa che è collegato allo stesso nome in qualsiasi altra posizione dichiarata con collegamento esterno. Cioè, le diverse istanze del nome in luoghi diversi si riferiscono allo stesso oggetto.

Dichiarare un identificatore all'interno di un blocco (incluso il blocco che definisce una funzione) fornisce l'ambito del blocco. L'ambito dell'istanza dell'identificatore termina alla fine del blocco.

La combinazione di extern con ambito di blocco consente a una funzione di visualizzare un identificatore esterno senza ingombrare lo spazio dei nomi di altre funzioni. (Tuttavia, è spesso cattiva pratica.)

Problemi correlati