Perché non è necessario decorare un "CARS CONST *" con "extern" quando condividelo attraversare più file
Domanda
Durante la lettura dei libri C ++, ho imparato che per condividere un const variabile / oggetto attraversare più file, dobbiamo definire la variabile conSt una volta in uno dei file e dichiararlo in ciascun file sorgente in cui viene utilizzato.Ad esempio,
In File1.cpp, definiamo una variabile conST INT a livello globale come
extern const int ca = 100;
.
In File2.cpp dove lo usiamo, dichiareremo questa variabile come
extern const int ca;
.
La convenzione di cui sopra ha perfettamente senso per me.Tuttavia, quando si arriva a un puntatore di Char Cost, non abbiamo bisogno di definirlo usando Extern, e può essere condiviso cross più file molto bene.Perché una cosa del genere accade?Ad esempio,
In File1.cpp, definiamo una variabile di punta di chart const a livello globale come
const char *cstr = "hello";
.
In File2.cpp dove lo usiamo, dichiareremo questa variabile come
extern const char *cstr;
.
Per rendere la mia domanda più specifica, perché CSTR può essere utilizzato in file2.cpp anche se non è decorato con "extern" in file1.cpp?
Molte grazie
Soluzione
Il problema è uno dei collegamenti.Quando definisci una variabile a Scope dello spazio dei nomi e non esiste una dichiarazione precedente che Stabilisce il collegamento, il collegamento esterno se l'oggetto non è Cost, interno se lo è.Quindi quando scrivi:
int const ca = 100;
.
In un file sorgente, il collegamento sarà interno e l'entità
(La variabile) ca
si riferisce a sarà unica a quella traduzione
unità.Se hai scritto:
int ca = 100;
.
Il collegamento sarebbe esterno, quindi un
extern int ca;
.
In un'altra unità di traduzione si riferirebbe alla stessa variabile.
E, naturalmente, quando scrivi:
char const* cstr = "hello";
.
Stai definendo un puntatore, che non è Cost (anche se punti da const).
Certo, normalmente, avresti dichiarato le variabili in un'intestazione,
con extern
, quindi ci sarebbe una dichiarazione precedente quando tu
Definire le variabili ed è la prima dichiarazione che
Stabilisce il collegamento.
Altri suggerimenti
L'esterno viene utilizzato per renderlo esplicito che l'istruzione "extern cost char * cstr;È una dichiarazione e non una definizione, CSTR è definita da qualche altra parte.Se hai fatto "Const Char * CSTR;"Il compilatore interpreterà come una definizione e finiresti con 2 variabili CSTR.
Se si applica extern on "const char * cstr=" hello ";"Immagino che il compilatore lo ignora perché l'inizializzazione significa che stai definire la variabile.
.