Perché non è necessario decorare un "CARS CONST *" con "extern" quando condividelo attraversare più file

StackOverflow https://stackoverflow.com//questions/24043974

  •  21-12-2019
  •  | 
  •  

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

È stato utile?

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.

Più qui: http://en.wikipedia.org/wiki/external_variable

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top