2010-08-19 14 views
9

So che static è una parola chiave sovraccaricata in C. Qui, sono interessato solo al suo utilizzo come parola chiave per applicare il collegamento interno.Collegamento interno con parola chiave statica in C

Se si dispone di una variabile globale dichiarata in un file .c, qual è la differenza tra l'utilizzo di static e non l'uso di static? In entrambi i casi, nessun altro file .c ha accesso alla variabile, quindi la variabile è fondamentalmente "privata" nel file, con o senza la parola chiave static.

Per esempio, se ho un file foo.c, e ho dichiarare una variabile globale:

int x = 5;

quella variabile x è disponibile solo per il codice all'interno foo.c (a meno che naturalmente dichiaro in qualche condiviso file di intestazione con la parola chiave extern). Ma se non lo dichiaro in un file di intestazione, quale sarebbe la differenza se dovessi digitare:

static int x = 5.

In entrambi i casi, sembra che x abbia il collegamento interno qui. Quindi sono confuso sullo scopo di static a questo proposito.

+2

Hai quasi risposto alla tua domanda - hai detto "se non lo dichiaro in un file di intestazione", che significa "se non scrivo una dichiarazione con la parola chiave extern". Il punto è che è * impossibile * scrivere una tale dichiarazione se hai dichiarato la tua variabile statica, mentre se non lo hai, qualcun altro potrebbe venire e farlo, collegare al tuo codice e avere accesso alla tua variabile. (Come cita Pascal Cuoq.) – Cascabel

+0

possibile duplicato di [Cosa significa "statico" in un programma C?] (Http://stackoverflow.com/questions/572547/what-does-static-mean-in- ac-programma). in particolare, mi rivolgo a questo caso nella mia risposta: http://stackoverflow.com/a/14339047/895245 –

risposta

10

Se si dispone di una variabile globale dichiarata in un file .c, qual è la differenza tra l'utilizzo static e che non utilizzano static? In entrambi i casi, nessun altro file .c ha accesso alla variabile [...]

un file diverso potrebbe dichiararex:

extern int x; 

che permetterebbe di codice riferimento x per la compilazione, e il linker collegherebbe felicemente tali riferimenti a qualsiasi x che trova.

static impedisce questo impedendo che x sia visibile al di fuori della sua unità di traduzione.

+0

Questo è interessante. Non sembra una caratteristica molto preliminare per un periodo in cui l'incapsulamento dei dati non è stato ampiamente praticato o incoraggiato? – Channel72

+0

In altre parole, globale consente a più dichiarazioni tra i file di condividere una singola definizione utilizzando 'extern' dove non lo sarà. Destra? – naivnomore

+0

@ Channel72: ecco perché i dati globali sono disapprovati: non è incapsulato. Se lo fosse, non sarebbe _global_ data. – sbi

6

C'è un solo "spazio dei nomi", per così dire, in C. Senza la parola chiave "statica" non si è protetti da un altro file usando il nome "x" (anche se non lo si rende visibile nel proprio intestazione della libreria).

Provare a collegare insieme diversi file C contenenti una variabile non statica x (intercalare gli accessi in lettura e scrittura dalle funzioni in ogni file) e confrontare con la situazione in cui queste variabili sono dichiarate statiche.

+0

Ovviamente, se nessuno di questi file * inizializza * la global x, potresti avere un blocco comune ... .anche se i tipi dei vari 'x' differiscono. Ringrazia la necessità di supportare anche FORTRAN nel linker per quello. – RBerteig

+0

@RBerteig Sì, senza inizializzazione era quello che intendevo. Il lettore chiedendo di cosa stiamo parlando può visitare per es. http://stackoverflow.com/questions/1490693/tentative-definitions-in-c99-and-linking –

+0

Devi solo amare tutte quelle piccole caratteristiche oscure e angoli e nicchie ... – RBerteig

Problemi correlati