2011-01-25 21 views
8

Eventuali duplicati:
Difference between 'global' and 'static global'Qual è la differenza tra static int ae int a?

Qual è la differenza tra le dichiarazioni 1 e 2: -

#include <stdio.h> 
//In the global declaration area 

static int a; // 1. 
int b;  // 2. 

Grazie per l'aiuto.

+0

Molti duplicati, ad es. [Differenza tra "globale" e "statico globale"] (http://stackoverflow.com/questions/959889/difference-between-global-and-static-global) –

+0

Oltre a tutte le risposte fornite, vale la pena ricordare che tutti le variabili statiche, indipendentemente da dove sono allocate, così come tutte le variabili globali (come "b" sopra), sono soggette a "inizializzazione statica". Ciò significa che devono essere inizializzati dal programma prima che inizi. In questo modo, sei garantito dallo standard che sono inizializzati. Se non li hai inizializzati in modo esplicito, sono implicitamente inizializzati a zero (o NULL per i puntatori). Questo li rende diversi dalle variabili dell'ambito locale. – Lundin

risposta

5

Una variabile globale static è locale alla translation unit è definito in Quindi, se si definisce static int a; in due diverse unità di traduzione, questo creerà due variabili indipendenti.. Se si definisce una variabile globale non statica int b; in due unità di traduzione, si verificherà un errore del linker (ma è possibile utilizzare extern int b; in una delle due unità di traduzione per indicare al linker che deve utilizzare la variabile globale dall'altra unità di traduzione).

+1

Grande spiegazione ..... grazie – Muse

6

Entrambi sono definizioni di variabili, tuttavia, la parola chiave static applicato ad una variabile nella "zona dichiarazione globale" limita quella variabile globale è visibile solo nell'unità traduzione in cui è definita.

+7

In altre parole, se si trova nel file 'foo.c', quindi' bar.c' non sarà in grado di accedervi, anche se si 'esterna 'esso. – EboMike

+0

@EboMike +1, grazie per ulteriori chiarimenti – SiegeX

2

static int a è accessibile solo all'interno di quel file. int b è possibile accedere con extern int b da un file diverso.

+0

Per essere pedante, se si definisce 'static int a' in un file di intestazione, non sarà accessibile" all'interno di quel file ";) –

3

Sono entrambi in memoria per l'intera durata del programma. La variabile dichiarata statica ha solo scope nel file in cui è dichiarata la posizione in cui è possibile accedere alla variabile dichiarata senza static da altri file usando una dichiarazione extern.

fonte originale - http://bytes.com/topic/c/answers/860211-global-variable-static-global-variable

+1

Questa risposta è la più completa fornito. – Lundin

1

La durata di una variabile statica si estende per tutta la durata del programma. Tuttavia, le regole di ambito si applicano ancora.

Se si definisce la variabile statica al di fuori di un metodo (normalmente all'inizio della classe), la variabile sarà disponibile da qualsiasi punto all'interno di tale classe.

Non è possibile modificare il valore di questi oggetti. Sono normalmente usati per memorizzare cose come le chiavi API.

1
static int a; 
int b; 

a dispone di collegamento interno. b ha il collegamento esterno.

C99 6.2.2

6.2.2 Legami di identi fi catori

  • 1) Un fi catore dichiarato in ambiti diversi o nello stesso ambito più di una volta può essere fatto per riferirsi al medesimo oggetto o funzione da un processo chiamato linkage. Esistono tre tipi di collegamento: esterno, interno e nessuno.

  • 2) Nel set di unità di traduzione e librerie che costituisce un intero programma, ogni dichiarazione di un particolare fi catore con collegamento esterno è indicato lo stesso oggetto o funzione. All'interno di un'unità di traduzione, ogni dichiarazione di un identificatore con collegamento interno denota lo stesso oggetto o funzione. Ogni dichiarazione di un identificatore senza collegamento denota un'entità univoca.

  • 3) Se la dichiarazione di un fi le ambito identi fi catore per un oggetto o una funzione contiene la Storage- classe specifica er statico, l'identi fi catore ha collegamento interno.

+0

Si presume che siano entrambi allocati nell'ambito del file. Se fossero allocati localmente, la tua affermazione non sarebbe vera. Lo statico avrebbe ancora il collegamento interno, ma il non-statico verrebbe allocato con il collegamento "automatico", cioè sullo stack o in un registro della CPU. – Lundin

+0

@Lundin: "Si presume che siano entrambi allocati nell'ambito del file" Controlla nuovamente la domanda. –

Problemi correlati