2010-02-16 20 views
48

Se si dispone di un file C come di seguito, qual è la differenza tra i e j?Statico vs globale

#include <stdio.h> 
#include <stdlib.h> 

static int i; 
int j; 

int main() 
{ 
    //Some implementation 
} 
+1

Leggi le risposte a questa domanda: http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar

+0

[Differenza tra variabile statica, automatica, globale e locale nel contesto di c e C++] (https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) –

risposta

44

i dispone di collegamento interno pertanto non è possibile utilizzare il nome i in altri file di origine (unità di traduzione rigorosamente) per fare riferimento allo stesso oggetto.

j dispone di un collegamento esterno per cui è possibile utilizzare j per fare riferimento a questo oggetto se lo si dichiara extern in un'altra unità di traduzione.

+7

C'è qualche differenza di prestazioni? – ma11hew28

+0

non dovrebbe esserci una differenza di runtime se si sta facendo la stessa cosa, in quanto il compilatore potrebbe generare lo stesso codice. Tuttavia, la compilazione potrebbe essere leggermente più lunga a livello globale, poiché ha una portata più ampia. –

17

i non è visibile all'esterno del modulo; j è accessibile a livello globale.

Cioè, un altro modulo, che è collegato ad esso, può fare

extern int j; 

e quindi in grado di leggere e scrivere il valore in j. Lo stesso altro modulo non può accedere a i, ma potrebbe dichiarare la propria istanza di esso, anche uno globale, che non è visibile al primo modulo.

+1

è il dichiarazione "extern" necessaria? –

+1

Dipende dall'implementazione. L'uso di 'extern' è garantito per non causare problemi, a condizione che un modulo abbia il simbolo come non-'extern' e pubblico (che lo assegna). Le prime implementazioni Unix combinavano simboli con lo stesso nome, proprio come un comune di Fortran, quindi "extern" non era richiesto. – wallyk

+1

Si noti che "Not visible" non significa che non lo è. Ciò significa che se dichiarassi un i in una diversa unità di compilazione e rimuoveresti l'i statico dal tuo file .c, il globale sarebbe visibile al tuo file .c. Al contrario, se il globale i fosse fuori portata non avrebbe importanza se si avesse uno statico dichiarato nel proprio file .c. Quello globale non sarebbe mai visibile. static I che ha la precedenza su un globale i definito in un'altra unità di compilazione è chiamato 'shadowing'. Succede anche con i locals di funzioni e non è una cosa C++/c-only. – Jupiter

4

La differenza è che i ha il collegamento interno e j ha un collegamento esterno. Ciò significa che puoi accedere a j da altri file a cui ti colleghi, mentre i è disponibile solo nel file in cui è stato dichiarato.

3

i avrà collegamento statico, vale a dire, la variabile è accessibile solo nel file corrente.

j dovrebbero essere definite come extern, cioè

extern int j; 

in un altro file di intestazione (.h), e quindi si avrà collegamento esterno, e sono accessibili attraverso i file.