2011-10-20 16 views
37

Eventuali duplicati:
Static vs globalC/C++ globale vs statico globale

Sono confuso sulle differenze tra variabili globali globali e statiche. Se statico significa che questa variabile è globale solo per lo stesso file, allora perché in due file diversi lo stesso nome causa un conflitto di nomi?

Qualcuno può spiegarlo?

+4

Invia il codice ... – Nawaz

+0

Hai un esempio? – glglgl

+2

Se entrambe le variabili sono dichiarate statiche in file diversi, non dovrebbero causare una collisione di nomi.Ho appena eseguito un test rapido e funziona come previsto. Se non funziona per te, pubblica il codice dove non funziona come ti aspetti, cosa ti aspetti e cosa ottieni e quale compilatore stai usando. – Kevin

risposta

65

Le variabili globali (non static) ci sono quando si crea il file .o disponibile per il linker per l'uso in altri file. Pertanto, se si dispone di due file di questo tipo, è ottenere il nome di collisione sulla a:

ac:

#include <stdio.h> 

int a; 

int compute(void); 

int main() 
{ 
    a = 1; 
    printf("%d %d\n", a, compute()); 
    return 0; 
} 

bc:

int a; 

int compute(void) 
{ 
    a = 0; 
    return a; 
} 

perché il linker non sa quale delle globale a da utilizzare.

Tuttavia, quando si definiscono globali statici, si sta dicendo al compilatore di mantenere la variabile solo per quel file e di non lasciare che il linker lo sappia. Quindi, se si aggiunge static (nella definizione di a) per i due codici di esempio che ho scritto, non sarà possibile ottenere collisioni di nomi semplicemente perché il linker non sa nemmeno esiste un a in uno dei file:

AC:

#include <stdio.h> 

static int a; 

int compute(void); 

int main() 
{ 
    a = 1; 
    printf("%d %d\n", a, compute()); 
    return 0; 
} 

bc:

static int a; 

int compute(void) 
{ 
    a = 0; 
    return a; 
} 

Questo significa che ogni file funziona con il proprio a senza conoscere gli altri.


Come nota a margine, è ok per avere uno di loro static e l'altro non nella misura in cui sono in file diversi. Se due dichiarazioni sono nello stesso file (leggi unità di traduzione), uno static e uno extern, vedere this answer.

+0

Che dire di dichiarare uno statico e l'altro no? – Kissaki

+1

@kissaki, se quelle dichiarazioni sono in file diversi, va bene. Il file con la dichiarazione statica utilizzerà quella variabile statica invisibile agli altri file. Tutti i file con la dichiarazione della variabile non statica utilizzerebbero la variabile globale condivisa. – Shahbaz

+0

Se queste due dichiarazioni, una statica e una esterna, sono scritte nello stesso file (leggere l'unità di traduzione), vedere [questa risposta] (http://stackoverflow.com/a/17043698/912144). – Shahbaz

6

Un nome che è statico in ogni file dovrebbe non causare conflitti di nome. Se lo stai vedendo, per favore pubblica un codice dimostrativo (breve) che lo mostri, insieme al compilatore esatto che stai usando in modo da poter verificare correttamente il codice e supponendo che sia corretto, vilify proprio il compilatore.

Proprio FWIW, il metodo preferito in C++ è quella di utilizzare un dominio anonimo invece:

namespace { 
    int not_a_static_variable; 
} 

In tutta onestà, non senza posso puntare a un sacco di vantaggio oggettivo a che anche se ...

+1

'In tutta onestà, no non posso puntare a molti vantaggi oggettivi a questo però ...' ... Forse questo argomento può aiutare in qualche modo: [Perché lo spazio dei nomi senza nome è un'alternativa "superiore" allo statico?] (http://stackoverflow.com/questions/4977252/why-unnamed-namespace-is-a-superior-alternative-to -statico) – Nawaz

+5

C++ 11 rimuove la deprecazione di oggetti statici, quindi in questi giorni nessuno dei due metodi è particolarmente "preferito". –

+0

@ MikeSeymour: è anche vero. – Nawaz