A diferença mais básica é de escopo.
No primeiro caso, você está declarando uma variável global. É uma variável que é acessível em todos os escopos após sua definição.
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;
};
No segundo caso, você está declarando uma variável estática com escopo local. A variável persistirá para que o programa inteiro seja executado de maneira semelhante às variáveis globais, mas estará acessível apenas no bloco de código em que está declarado. Este é o mesmo exemplo, com apenas uma alteração. count
agora é declarado como uma variável estática dentro loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Isso não será compilado, pois a função inc()
não tem acesso count
.
As variáveis globais, por mais úteis que sejam, vêm com algumas armadilhas. Eles podem até causar danos quando se trata de escrever programas que podem interagir com o ambiente físico. Este é um exemplo muito básico de algo que provavelmente acontecerá, assim que os programas começarem a ficar maiores. Uma função pode alterar inadvertidamente o estado de uma variável 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;
}
Esses casos são muito difíceis de depurar. Esse tipo de problema, no entanto, pode ser facilmente detectado, simplesmente usando uma variável 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;
}