2012-08-29 35 views
13

C++ Primer diceSu variabili statiche locali e globali in C++

Ogni variabile statica locale viene inizializzata prima della prima volta l'esecuzione passa attraverso la definizione dell'oggetto. Le statiche locali sono non distrutte quando termina una funzione; vengono distrutti quando termina il programma .

Le variabili statiche locali sono diverse dalle variabili statiche globali? Altro quindi il luogo in cui sono dichiarati, cos'altro è diverso?

void foo() { 
    static int x = 0; 
    ++x; 

    cout << x << endl; 
} 

int main (int argc, char const *argv[]) { 
    foo(); // 1 
    foo(); // 2 
    foo(); // 3 
    return 0; 
} 

confrontare con

static int x = 0; 

void foo() { 
    ++x; 

    cout << x << endl; 
} 

int main (int argc, char const *argv[]) { 
    foo(); // 1 
    foo(); // 2 
    foo(); // 3 
    return 0; 
} 

risposta

18

Le differenze sono:

  • Il nome è accessibile solo all'interno della funzione, e non ha alcun legame.
  • Viene inizializzato la prima volta che l'esecuzione raggiunge la definizione, non necessariamente durante le fasi di inizializzazione del programma.

La seconda differenza può essere utile per evitare il intialisation statica ordine fiasco, dove le variabili globali sono accessibili prima di essere inizializzati. Sostituendo la variabile globale con una funzione che restituisce un riferimento a una variabile statica locale, è possibile garantire che sia inizializzata prima che qualsiasi cosa acceda a essa. (Tuttavia, non c'è ancora alcuna garanzia che non sarà distrutto prima che qualcosa finisca di accedervi, ma è comunque necessario fare molta attenzione se si pensa di aver bisogno di una variabile accessibile a livello globale.Vedere i commenti per un link per aiutare in quella situazione.)

+1

È possibile garantire l'ordine di distruzione con un po 'di lavoro. http://stackoverflow.com/a/335746/14065 –

5

Il loro campo di applicazione è diversa. Una variabile statica con ambito globale è accessibile a qualsiasi funzione nel file, mentre la variabile nell'ambito della funzione è accessibile solo all'interno di quella funzione.

+0

Sì, certo. Grazie – JAM

+0

@ DavidRodríguez-dribeas: "non è definito sull'unità di compilazione ** s **. All'interno di un'unità di compilazione l'ordine è ben definito come l'ordine di dichiarazione. –

+0

@LokiAstari: hai ragione ... ero troppo vaga nel commento :) –

4
Ci

vero nome è:

static storage duration object. 

Le variabili globali sono anche 'oggetto durata di conservazione statica'. La differenza principale dalle variabili globali sono:

  • Essi non sono inizializzate fino alla prima dell'uso
    Nota: Un'eccezione durante la costruzione significa che non sono stati inizializzati e quindi non utilizzati.
    Quindi riproverà la volta successiva che viene inserita la funzione.
  • Ci
  • visability è limitato dalla loro portata
    (cioè non può essere visto all'esterno della funzione)

parte che sono proprio come 'oggetti durata di conservazione statica' altra.

Nota: come tutti gli oggetti di durata di archiviazione statici, vengono distrutti in ordine inverso di creazione.

+0

Sto interpretando erroneamente le specifiche quando l'ho letto perché le locande statiche _sono_ essere inizializzate insieme alle altre statistiche e non possono essere ritardate fino alla prima chiamata ? (C++ 11 §6.7.4 sembra inoltrare a §3.6.2 per alcuni casi e permetterlo) –

+0

** 3.7.1 Durata di archiviazione statica ** (Nota: 6.7 descrive l'inizializzazione delle variabili statiche locali). ** 6.7 Dichiarazione dichiarazione ** (L'inizializzazione costante (3.6.2) di un'entità a ambito di blocco con durata di memorizzazione statica, se applicabile, viene eseguita prima che il suo blocco venga immesso per la prima volta. In caso contrario, tale variabile viene inizializzata la prima volta il controllo passa attraverso la sua dichiarazione Initialization costante (3.6.2) di un'entità a ambito di blocco con durata di archiviazione statica, tale variabile viene considerata inizializzata al completamento della sua inizializzazione.) –

1

La differenza principale o più grave è il tempo di inizializzazione. Le variabili statiche locali vengono inizializzate alla prima chiamata per funzionare dove vengono dichiarate.Quelli globali sono inizializzati ad un certo punto nel tempo prima della chiamata alla funzione principale, se si hanno poche variabili statiche globali sono intializzati in un ordine non specificato, che può causare problemi; questo è chiamato fiasco di inizializzazione statica.

0

Nel primo blocco di codice, x è locale alla funzione foo() che significa che è stato creato in foo() e distrutto alla fine della funzione dopo cout. Tuttavia, nel secondo blocco x è globale, il che significa che l'ambito di x è l'intero programma. Se si voleva sotto int main vostra potrebbe cout < < x < < endl e sarebbe stampare comunque, nel primo blocco direbbe x non dichiarato

0
  1. Essi sono noti a tutte le funzioni in un programma, mentre globale le variabili sono conosciute solo in un ambito limitato.
  2. Le variabili statiche globali possono essere inizializzate prima dell'avvio del programma mentre le variabili statiche locali possono essere inizializzate quando il punto di esecuzione raggiunge il punto.
3

Speriamo che questo esempio possa aiutare a capire la differenza tra la variabile statica locale e globale.

#include <iostream> 

using namespace std; 

static int z = 0; 

void method1() { 
    static int x = 0; 
    cout << "X : " << ++x << ", Z : " << ++z << endl; 
} 

void method2() { 
    int y = 0; 
    cout << "Y : " << ++y << ", Z : " << ++z << endl; 
} 

int main() { 
    method1(); 
    method1(); 
    method1(); 
    method1(); 
    method2(); 
    method2(); 
    method2(); 
    method2(); 
    return 0; 
} 

uscita:

X : 1, Z : 1 
X : 2, Z : 2 
X : 3, Z : 3 
X : 4, Z : 4 
Y : 1, Z : 5 
Y : 1, Z : 6 
Y : 1, Z : 7 
Y : 1, Z : 8 
Problemi correlati