[C] domanda variabili (globali) EXTERN

di Anonimizzato27445 il
8 risposte
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:
#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:
#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

8 Risposte

  • Il default per le variabili globali è il linkage extern
  • oregon ha scritto:


    Il default per le variabili globali è il linkage extern
    In che senso ?
    Potresti essere un po' più chiaro perfavore
  • Per le variabili globali extern è opzionale nel caso che hai mostrato tu.
  • oregon ha scritto:


    Per le variabili globali extern è opzionale nel caso che hai mostrato tu.
    Ok ti ringrazio, quando invece serve ?
  • A che serve signed quando gli int di default sono tutti signed int? Qualcuno, però, potrebbe cambiare le opzioni di compilazione
  • Weierstrass ha scritto:


    A che serve signed quando gli int di default sono tutti signed int? Qualcuno, però, potrebbe cambiare le opzioni di compilazione
    Scusa ma continuo a non capire
  • La sai la differenza tra static, extern, auto e register? Bene, se non la specifichi di default viene assunto extern, così come se non specifichi tra signed e unsigned viene assunto signed di default.

    Nel tuo caso funziona lo stesso, ma in che modulo sta la variabile?
  • Weierstrass ha scritto:


    La sai la differenza tra static, extern, auto e register? Bene, se non la specifichi di default viene assunto extern, così come se non specifichi tra signed e unsigned viene assunto signed di default.

    Nel tuo caso funziona lo stesso, ma in che modulo sta la variabile?
    La variabile sta nel secondo sorgente.
    Quindi è per questo motivo che anche se elimino il prefisso extern funziona comunque giusto?
Devi accedere o registrarti per scrivere nel forum
8 risposte