RISOLTO [C] domanda variabili globali (extern)

Stato
Discussione chiusa ad ulteriori risposte.

demda

Utente Attivo
Salve a tutti, stavo approfondendo il discorso delle variabili globali circa le funzioni e mi è sorto questo dubbio, spero riusciate ad aiutarmi.

Da ciò che ho capito sulle variabili globali, sono variabili visibili ed utilizzabili da tutte le funzioni del programma, il cui valore viene mantenuto integro per tutta l'esecuzione del programma. Il mio dubbio ricade sul prefisso extern, da quello che ho letto si indica il prefisso extern quando utilizzo delle funzioni (che usufruiscono di questa variabili esterna) la cui implementazione è stata sviluppata in un altro sorgente, "per dire alle suddette funzioni che quella variabile con cui devono lavorare è per l'appunto esterna"
Però provando a compilare i 2 sorgenti che seguono, anche se non indico il prefisso extern nel secondo sorgente ( quello che contiene l'implementazione delle funzioni), la compilazione va a buon fine quindi il programma funziona a dovere:


Sorgente 1:
C:
#include<stdio.h>

void azzera();
void somma(double v);
void sottrai(double v);
void moltiplica(double v);
void dividi(double v);

double valore_corrente;

int main (int argc, char *argv[]){
    azzera();
    somma(5);
    somma(27);
    sottrai(4);
    
    moltiplica(3);
    dividi(7);
    printf("Valore corrente: %5.3f \n",valore_corrente);
    return 0;
}

void azzera(){
valore_corrente = 0;
}
void somma(double v){
valore_corrente += v;
}
void sottrai(double v){
valore_corrente -= v;
}
Sorgente 2:
C:
#include<stdio.h>
extern double valore_corrente; //Se sostituisco con " double valore_corrente " funziona ugualmente
 
void moltiplica(double v){
valore_corrente *= v;
}
void dividi(double v){
valore_corrente /= v;
}

La mia domanda quindi è: perchè se non indico il prefisso extern il programma viene compilato senza errori e funziona a dovere ?
Alla luce di tutto questo a che serve realemente il prefisso extern ?

Spero di essere stato chiaro, grazie per l'aiuto

P.S.
per compilare utilizzo GCC con il seguente comando:
gcc sorgente1.c sorgente2.c -o eseguibile
 

Andretti60

Utente Èlite
3,674
2,456
Hardware Utente
Sei capitato in una delle tante contraddizioni del linguaggio C :)

La regola e' che una variabile la puoi dichiarare tante volte quanto vuoi, ma la puoi definire solo una volta.
Putroppo questa regola non e' rispettata da tutti i compilatori, finche' la variabile non e' mai inizializzata (come nel tuo caso) o inizializzata solo in un file, il compilatore automaticamente genera una variabile sola che viene "vista" da tutti i file (in altre parole, aggiunge automaticamente un "extern" in tutti i file eccetto uno) Probabilmente il tuo gcc ha una opzione per disabilitare questa eccezione.
Come conseguenza, eliminando la parola chiave extern in un file produci un programma che viene compilato diversamente a seconda del compilatore che stai usando e dalle opzioni che hai dichiarato. NON farlo. Funziona, ma solo nel tuo caso.

Ecco uno dei tanti motivi per cui condividere una variabile tra diversi file e' causa di cosi' tanti problemi. Nei linguaggi moderni e nella metodologia OOP variabili globali non esistono nemmeno (per fortuna).
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando