[C] domanda variabili (globali) EXTERN

di il
8 risposte

[C] domanda variabili (globali) EXTERN

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

  • Re: [C] domanda variabili (globali) EXTERN

    Il default per le variabili globali è il linkage extern
  • Re: [C] domanda variabili (globali) EXTERN

    oregon ha scritto:


    Il default per le variabili globali è il linkage extern
    In che senso ?
    Potresti essere un po' più chiaro perfavore
  • Re: [C] domanda variabili (globali) EXTERN

    Per le variabili globali extern è opzionale nel caso che hai mostrato tu.
  • Re: [C] domanda variabili (globali) EXTERN

    oregon ha scritto:


    Per le variabili globali extern è opzionale nel caso che hai mostrato tu.
    Ok ti ringrazio, quando invece serve ?
  • Re: [C] domanda variabili (globali) EXTERN

    A che serve signed quando gli int di default sono tutti signed int? Qualcuno, però, potrebbe cambiare le opzioni di compilazione
  • Re: [C] domanda variabili (globali) EXTERN

    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
  • Re: [C] domanda variabili (globali) EXTERN

    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?
  • Re: [C] domanda variabili (globali) EXTERN

    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