Самое основное отличие заключается в сфере применения.
В первом случае вы объявляете глобальную переменную. Это переменная, которая доступна в любой области видимости после ее определения.
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;
};
Во втором случае вы объявляете статическую переменную с локальной областью действия. Переменная будет сохраняться в течение всего запуска программы, аналогично глобальным переменным, но будет доступна только в блоке кода, в котором она объявлена. Это тот же пример, только с одним изменением. count
теперь объявлен как статическая переменная внутри loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Это не скомпилируется, так как функция inc()
не имеет доступа к count
.
Глобальные переменные, какими бы полезными они ни казались, сопряжены с некоторыми подводными камнями. Они могут даже нанести ущерб, когда речь идет о написании программ, которые могут взаимодействовать с физическим окружением. Это очень простой пример того, что может произойти, как только программы станут больше. Функция может непреднамеренно изменить состояние глобальной переменной.
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;
}
Такие случаи очень сложно отлаживать. Однако этот тип проблемы легко обнаружить, просто используя статическую переменную.
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;
}