Newsgroup: it.comp.lang.c++
Titolo: HELP! Libro 'sasinooooo

Stavo leggendo un libro x ripasso quando capito su un capitolo che fà
un'enome confusione su variabili interne, esterne e statiche! Insomma... non
ci capisco + niente! Maledetto..
Mi spieghereste cosa si intende x variabile interna, esterna e statica e
tutte le loro relative combinazioni?

,

---------------BEGIN FILE1.CPP------------
int g_Int;
int funct1(int a)
{
static int Counter;
    g_Int=a;
    Counter++;
    retunr 0;
}
---------------BEGIN FILE2.CPP------------
extern int g_Int;
int funct2(int b)
{
int Counter;
    g_Int=b;
    Counter++;
    return 1;
}
--------------------------
g_Int e' una variabile globale per il modulo (unita'
di compilazione) FILE1.
g_Int e' esterna per la unita' di compilazione FILE2.
Nel modulo FILE1 il compilatore riserva lo spazio per un int
nellarea dei dati inizializzati del modulo.
Con lo specificatore extern il compilatore riesce a conoscere
la dimensione (il tipo) del dato g_Int, ma delega al linker
la risoluzione del simbolo (cioe' dove esattamente in memoria
deve andare a mettere l'intero).
La variabile statica Counter appartiene alla funzione funct1,
nel senso che sopravvive alla deallocazione dello stack frame
conservando il suo valore tra una chiamata e l'altra.
Di solito il compilatore riserva spazio per le variabili
statiche nello spazio dei dati inizializzati, e garantisce che
l'accesso alla variabile avvenda solo all'interno dell'ambito
(scope) in cui e' stata definita/dichiarata.
Penso che il tuo libro per variabili interne intenda quelle locali,
tipo Counter definita in funct2.
Per tale variabile non viene riservato alcuno spazio in fase di
compilazione, ma a run-time, viene creato spazio sullo stack.
Ogni chiamata alla funzione avra', potenzialmente, una diversa
collocazione in memoria per Counter (e questo rende terribilmente
pericoloso restituire riferimenti a variabili locali come
parametri di uscita di una funzione).
Il valore iniziale di Counter nel caso di funct2 e' arbitrario:
tipicamente e' quello che si trova in quel momento in memoria,
ma alcune implementazioni azzerano anche le variabili locali.
Ho fatto l'esempio in C, anziche' in C++ per chiarezza.
Spero di non avere introdotto errori gravi nella esposizione.
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own    

Ho fatto l'esempio in C, anziche' in C++ per chiarezza.
Premesso che l'esempio e` a tutti gli effetti C++...
che vuol dire "per chiarezza"? Che il C++ e` oscuro?
Scusa la critica, ma questo e` un atteggiamento che non approvo perche`
e` come sostenere che il C++ complica le cose e quindi e` intrinsecamente
"da buttare". Che non sia un linguaggio facile e` risaputo, ma non mi sembra che
da questo punto di vista il C brilli molto piu` del C++!
Inoltre la chiarezza e` una cosa che dipende piu` dal programmatore che dal linguaggio
(con le dovute eccezioni nelle quali cmq non mi pare il C/C++ rientrino).
Saluti,
Paolo
------------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
------------------------------------------------------------------


Critiche accettate.
Mi sono permesso di non usare cose del tipo
int foo(int b)
{
  static int a;
  if (b){
    static int c=b;
  }
  return 0;
}
oppure le variabili ed i metodi statici di classe.
Forse ho confuso la chierezza con la "semplicita' di esposizione".
Mi scuso per l'inconveniente.
