2009-02-10 20 views
7

Qual è la differenza tra variabile globale e variabile file in C++?variabile globale V.S. variabile di file in C++

Grazie!

+0

scusa la mia ignoranza, ma io vengo da aa principalmente C/Objective C di sfondo e non ho mai sentito parlare di una variabile di file ... Do intendi una variabile globale che è visibile solo nel file che è definito? – hhafez

+0

chiarire: presumo tu voglia dire se la parola chiave "statico" sia usata o meno? (le vars globali statiche sono visibili solo in quel file) –

risposta

0

L'unica differenza è che le variabili di file sono accessibili solo all'interno del file. Ma hanno la stessa vita.

12

In C e C++ è possibile rendere una variabile globale accessibile solo dal file in cui è dichiarata utilizzando la parola chiave statica davanti alla dichiarazione. Globali che non usano la parola chiave static sono accessibili da qualsiasi file C o C++ compilato nel programma.

Il metodo statico globale è deprecato in C++ a favore di spazi dei nomi anonimi. Anche le dichiarazioni inserite all'interno di uno spazio dei nomi anonimo sono accessibili solo all'interno di quel file.

+0

è valido anche per le classi definite dall'utente? Ho dichiarato un oggetto in file1 e voglio accedervi in ​​entrambi i file (file1, file2), Ho inserito '#include file2.h' in file1 e 'classe ClassName;' nel file2 in modo che riconosca il classe .. ma ancora mi dà un errore !! – Katia

6

I programmi C++ sono compilati un'unità di traduzione alla volta (in pratica, ciò significa che ogni file .cpp viene compilato in modo indipendente).

Per default, le variabili che sono non const, funzioni che non sono inline e typedef s hanno collegamento interno: ciò significa che essi non sono visibili ad altre unità di traduzione. Se altre unità di traduzione si riferiscono a un simbolo con collegamento interno (dopo che dichiara, che richiede la parola chiave extern per le variabili), il linker non sarà in grado di trovarle.

Per richiedere esplicitamente il collegamento interno, utilizzare la parola chiave static o, meglio, utilizzare spazi dei nomi senza nome.

3

Nota: Queste regole si applicano a C++ così come a C, con alcune transazioni con scope class/struct/namespace. (Non ho notato che la domanda riguardava C++, non C.)

Ricordare che (nella maggior parte dei casi) i file di origine C sono compilati in file oggetto. I file oggetto hanno una tabella 'export' che indica al linker (quando si collega) quali simboli fornisce. Un simbolo è un nome (il suo nome esatto dipende dall'ABI) che si riferisce a una funzione o variabile (nella maggior parte dei casi).

Quando si dichiara una variabile globale nel file sorgente C, in questo modo:

// fileA.c 
int hello = 42; 

void printMessage() { 
    printf("Hello, %d world(s)!\n", hello); 
} 

hello e printMessage vengono esportati. Quando un file oggetto C richiede un simbolo denominato "hello" (presupponendo un semplice ABI), il linker lo collega con lo hello esportato da fileA.c.

Ora per l'altro caso. Quando si dichiara una variabile del file locale in questo modo:

// fileB.c 
static int world = 9001; 

static void messagePrint() { 
    printf("It's over %d!\n", world); 
} 

world e messagePrint sono non esportato. Quando un file oggetto C richiede un simbolo chiamato "hello", il linker non può collegarlo con lo hello di fileB.c perché non ci sono informazioni su di esso in fileB.obj (o qualsiasi altra cosa).

Come può messagePrint conoscere world, tuttavia? Entrambi sono nella stessa unità di traduzione. L'ambito prende il sopravvento qui. Sono sicuro che troverai molte informazioni su scope through Google.

(sta avendo il nome del simbolo corrisponde allo standard funzione/nome della variabile in C? So che è diverso per C++ (dove non v'è alcuna standardizzazione per il nome mangling), motivo per cui cito ABI, in primo luogo.)

((Se ABI il termine corretto, anche;? P))