2013-10-17 20 views
8

Diciamo che avete una classe (C++) o un modulo (file singolo c). Quindi in una delle tue funzioni vuoi memorizzare una copia di una variabile e mantenerne il valore fino alla prossima chiamata della funzione, è meglio avere una globale (potrebbe essere privata in C++ e non esternamente in c per mantenere nello scope del modulo) o creare una variabile statica locale?Per creare una variabile persistente è meglio avere una variabile statica locale o globale?

es .:

void some_func_that_does_not_do_anything_useful(int arbVal) 
{ 
    static int lastArbVal = 0; 

    if (arbVal > lastArbVal) 
    { 
     lastArbVal = arbVal; 
    } 
} 

Il motivo che mi avrebbe fatto uno statica è quello di mantenere la sua portata quanto più limitato possibile, ma certe cose che ho letto suggerisco si dovrebbe usare globali per questo, così ora sono confuso.

Cosa è meglio (se presente) ?, vantaggi/svantaggi?

+2

Se lo si utilizza solo in quella funzione e in nessun altro luogo, renderlo 'static' è probabilmente la soluzione migliore. Anche se potresti voler pensare a casi come il multi-threading, la variabile statica sarà condivisa tra tutti i thread. –

+0

Nell'interesse dell'incapsulamento, una statica locale sarebbe la migliore. Questo è anche l'approccio adottato da molte funzioni C. 'strtok' viene in mente. – Adam

+1

Per citare dalla pagina man di 'strtok':" Non usare mai queste funzioni ". Non usiamolo come esempio di come fare le cose :-) –

risposta

10

La regola qui è semplice: se la variabile deve essere accessibile da più di una funzione, renderla globale. In caso contrario, le variabili static all'interno delle funzioni sono generalmente migliori. Uno dei professionisti è che evita di inquinare lo spazio dei nomi globale.

Nota che se una variabile globale non ha bisogno di essere accessibile al di fuori del file, è meglio dichiararla come variabile del file-scope (ad esempio, dichiararla come static)

Torna al tuo esempio, penso è meglio usare la variabile static come hai già fatto.

+1

Un'alternativa all'ambito di file 'static' è uno spazio dei nomi anonimo. – juanchopanza

+2

Un altro motivo per cui il campo 'static' potrebbe non essere adatto è l'ordine di inizializzazione statico. Se la funzione che lo utilizza viene chiamata durante l'inizializzazione di altre statistiche da diverse unità di traduzione, allora sei nei guai. – jrok

Problemi correlati