La diferencia más básica es de alcance.
En el primer caso, estás declarando una variable global. Es una variable accesible en todos los ámbitos después de su definición.
void setup()
{
Serial.begin(9600);
}
void inc();
int count = 0;
void loop()
{
Serial.println(count);
count++;
inc();
delay(500);
}
void inc() //Can edit the value of count
{
count=count+1;
};
En el segundo caso, está declarando una variable estática con alcance local. La variable persistirá para todo el programa ejecutado de manera similar a las variables globales, pero será accesible solo en el bloque de código en el que se declara. Este es el mismo ejemplo, con solo un cambio. count
ahora se declara como una variable estática dentro loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Esto no se compilará ya que la función inc()
no tiene acceso count
.
Las variables globales, aunque aparentemente útiles, vienen con algunas trampas. Incluso pueden causar daños cuando se trata de escribir programas que puedan interactuar con el entorno físico. Este es un ejemplo muy básico de algo que es probable que suceda, tan pronto como los programas comiencen a crecer. Una función puede cambiar inadvertidamente el estado de una variable global.
void setup()
{
Serial.begin(9600);
}
void another_function();
int state=0;
void loop()
{
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Inadvertently changes state
state=1;
}
Tales casos son muy difíciles de depurar. Sin embargo, este tipo de problema se puede detectar fácilmente, simplemente usando una variable estática.
void setup()
{
Serial.begin(9600);
}
void another_function();
void loop()
{
static int state=0;
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Results in a compile time error. Saves time.
state=1;
}