Quando usare extern in C ++

Sto leggendo “Pensa in C ++” e ha appena introdotto la dichiarazione extern . Per esempio:

 extern int x; extern float y; 

Penso di capire il significato (dichiarazione senza definizione), ma mi chiedo quando si rivelerà utile.

Qualcuno può fornire un esempio?

    Questo è utile quando hai variabili globali. Dichiarate l’ esistenza di variabili globali in un’intestazione, in modo che ogni file sorgente che include l’intestazione ne sia a conoscenza, ma dovete solo “definirlo” una volta in uno dei vostri file sorgente.

    Per chiarire, usando extern int x; dice al compilatore che un object di tipo int chiamato x esiste da qualche parte . Non è compito dei compilatori sapere dove esiste, basta conoscere il tipo e il nome in modo che sappia come usarlo. Una volta che tutti i file sorgente sono stati compilati, il linker risolverà tutti i riferimenti di x alla prima definizione che trova in uno dei file sorgente compilati. Affinché funzioni, la definizione della variabile x deve avere il cosiddetto “collegamento esterno”, che in pratica significa che deve essere dichiarato al di fuori di una funzione (in quello che viene solitamente chiamato “l’ambito del file”) e senza la parola chiave static .

    intestazione:

     #ifndef HEADER_H #define HEADER_H // any source file that includes this will be able to use "global_x" extern int global_x; void print_global_x(); #endif 

    fonte 1:

     #include "header.h" // it needs to be defined somewhere int global_x; int main() { //set global_x here: global_x = 5; print_global_x(); } 

    fonte 2:

     #include  #include "header.h" void print_global_x() { //print global_x here: std::cout < < global_x << std::endl; } 

    È utile quando condividi una variabile tra alcuni moduli. Lo si definisce in un modulo e si utilizza extern negli altri.

    Per esempio:

    in file1.cpp:

     int global_int = 1; 

    in file2.cpp:

     extern int global_int; //in some function cout < < "global_int = " << global_int; 

    Riguarda il collegamento .

    Le risposte precedenti fornivano buone spiegazioni su extern .

    Ma voglio aggiungere un punto importante.

    Chiedete di extern in C ++ non in C e non so perché non ci sia una risposta riguardo al caso in cui extern viene fornito con const in C ++.

    In C ++, una variabile const ha il collegamento interno per impostazione predefinita (non come C).

    Quindi questo scenario porterà all’errore di collegamento :

    Fonte 1:

     const int global = 255; //wrong way to make a definition of global const variable in C++ 

    Fonte 2:

     extern const int global; //declaration 

    Deve essere così:

    Fonte 1:

     extern const int global = 255; //a definition of global const variable in C++ 

    Fonte 2:

     extern const int global; //declaration 

    Questo è utile quando vuoi avere una variabile globale. Si definiscono le variabili globali in qualche file sorgente e si dichiarano extern in un file di intestazione in modo che qualsiasi file che include quel file di intestazione vedrà quindi la stessa variabile globale.

    Quando hai variabili globali devi dichiararle extern in qualsiasi unità di traduzione in cui non sono definite o otterrai più definizioni. Questo è ovviamente da evitare poiché i globalmente non sono generalmente buoni.

    Quando stai scrivendo in C e vuoi consentire agli utenti C ++ di usare la tua libreria, dichiari il tuo contenuto in un blocco extern "C" {} . Dato che C fa schifo, non dovresti averne bisogno.

    E poi ci sono i modelli extern, che non fanno più parte dello standard.

    Infine, viene dichiarata un’istanza di modello che si verifica da qualche altra parte e si desidera collegarsi ad essa anziché crearne una nuova. Dichiari anche quegli extern. Questo ha un uso occasionale … forse … non l’ho mai fatto.

    Penso di poter contare la quantità di volte in cui ho avuto bisogno di “extern” in C ++ da una parte poiché tendo ad evitare tutti i costrutti in cui è necessario.