Найбільш основна відмінність полягає в масштабі.
У першому випадку ви оголошуєте глобальну змінну. Це змінна, яка доступна в будь-якій області після її визначення.
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;
}