Le variabili globali (non static
) ci sono quando si crea il file .o
disponibile per il linker per l'uso in altri file. Pertanto, se si dispone di due file di questo tipo, è ottenere il nome di collisione sulla a
:
ac:
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
bc:
int a;
int compute(void)
{
a = 0;
return a;
}
perché il linker non sa quale delle globale a
da utilizzare.
Tuttavia, quando si definiscono globali statici, si sta dicendo al compilatore di mantenere la variabile solo per quel file e di non lasciare che il linker lo sappia. Quindi, se si aggiunge static
(nella definizione di a
) per i due codici di esempio che ho scritto, non sarà possibile ottenere collisioni di nomi semplicemente perché il linker non sa nemmeno esiste un a
in uno dei file:
AC:
#include <stdio.h>
static int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
bc:
static int a;
int compute(void)
{
a = 0;
return a;
}
Questo significa che ogni file funziona con il proprio a
senza conoscere gli altri.
Come nota a margine, è ok per avere uno di loro static
e l'altro non nella misura in cui sono in file diversi. Se due dichiarazioni sono nello stesso file (leggi unità di traduzione), uno static
e uno extern
, vedere this answer.
Invia il codice ... – Nawaz
Hai un esempio? – glglgl
Se entrambe le variabili sono dichiarate statiche in file diversi, non dovrebbero causare una collisione di nomi.Ho appena eseguito un test rapido e funziona come previsto. Se non funziona per te, pubblica il codice dove non funziona come ti aspetti, cosa ti aspetti e cosa ottieni e quale compilatore stai usando. – Kevin