Newsgroup: it.comp.lang.c
Titolo: Variabili extern static e dichiarazioni...

Salve a tutti,
                               ho scritto un programma piuttosto complesso
che č composto di parecchi files e interfaccia sorgenti C e Fortran .
Dovendo gestire parecchie variabili globali, ho scritto un file common.h che
le dichiara e l'ho incluso in ogni sorgente. Cosě tutto sembra funzionare a
dovere ma  mi č restato il dubbio sull'utilizzo del prefisso 'extern' e di
quello 'static'. C'č qualche buon'anima che mi chiarisce le idee e mi dice
se occorre dichiarare extern le variabili globali utilizzate in ogni sinolo
sorgente?
Grazie a tutti!
Ciao
M D

sorgente?
Un sistema che viene usato spesso e' questo...
     /****** common.h ******/
     #if !defined(COMMON_H)
     #define COMMON_H
     #if !defined(DEFINE_GLOBALS)
     #define EXTERN extern
     #else
     #define EXTERN
     #endif
     EXTERN int    myvar1;
     EXTERN double myvar2;
     EXTERN char   myvar3[200];
     ...
     #endif
     /****** module1.c ******/
     #include "common.h"
     ...
     /****** module2.c ******/
     #include "common.h"
     ...
     /****** global.c ******/
     #define DEFINE_GLOBALS
     #include "common.h"
In questo modo le variabili globali sono elencate in
un posto solo e vengono correttamente dichiarate
"extern" in tutti i moduli tranne uno che e' il modulo
che le definisce (ne alloca lo spazio).
Il prefisso "static" invece devi usarlo per tutte
le variabili che definisci per uso interno di un
singolo modulo. Il concetto e' simile a quello delle
variabili locali della singolo funzione con la
differenza che queste variabili possono essere visibili
da tutte le funzioni dello stesso modulo .c.
Se in un sorgente C dichiari una variabile al di fuori
di una funzione senza mettere "static" la stai esportando
come variabile globale e quindi risultera' visibile a
tutti i moduli del programma che la dichiareranno
con il prefisso "extern".
La parola "static" si puo' anche usare nella
dichiarazione di una variabile locale di una singola
funzione e in questo caso significa che quella variabile
dovra' avere una "vita" uguale a quella di una variabile
globale (ovvero dovra' mantenere lo stesso valore fra
una chiamata e la successiva) ma che la visibilita'
dovra' essere limitata a quella funzione (ovvero nessuna
altra funzione - incluse quelle dello stesso modulo -
potranno accedere alla variabile). Ad esempio:
  /*
  ** Torna un valore incrementato ad ogni chiamata.
  ** Non usa nessuna variabile globale.
  */
  int Count(void)
  {
    static int count=0;
    return ++count;
  }
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 sorgente?
Si, le variabili globali vanno definite in un solo punto e dichiarate in
tutti gli altri punti (o in un file .h) come extern. Invece static
renderebbe la variabile locale al singolo sorgente, definendone quindi
(e non solo dichiarandone), se messa in un .h, una copia per ogni
sorgente.
EMG

 sorgente.
Da quello che ho inteso static non è altro che un modo per definire una
variabile locale di un modulo? E' veramente solo questo o sto perdendo il
filo???
E' vero che la particella static inizializza automaticamente la variabile
dichiarata ad ogni lettura del modulo contenente la dichiarazione in
qustione?
Grazie ancora a tutti!
Ciao e buona giornata M D

 ha scritto nel messaggio
news:3a616ce...@news.interbusiness.it...


 qustione?
No, le variabili definite all'esterno di qualsiasi funzione (static o
non static) hanno il lifetime dell'applicazione.
EMG

suggerimento.
Come regola numero uno ti consiglierei di dubitare molto meno del
compilatore. I compilatori non sono perfetti (il software perfetto
non esiste) ma la probabilita' che l'errore stia nel tuo codice
e' decisamente piu' alta (e non prenderela come un'offesa).
I sintomi mi porterebbero a pensare che hai definito delle
matrici troppo piccole rispetto ai dati che vuoi memorizzarci.
Non e' che per caso hai qualcosa come:
   int m[10][10];
e poi vai a scrivere in m[10][10] ? In C una dichiarazione come
quella mostrata permette agli indici di raggiungere al massimo
il valore 9. La matrice ha infatti 10 righe (numerate da 0 a 9)
e dieci colonne (numerate da 0 a 9).


Grazie Andrea per la diagnosi e la cura!
Saluti
            M D
