Sự khác biệt cơ bản nhất là về phạm vi.
Trong trường hợp đầu tiên, bạn đang khai báo một biến toàn cục. Đó là một biến có thể truy cập trong mọi phạm vi sau định nghĩa của 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;
};
Trong trường hợp thứ hai, bạn đang khai báo một biến tĩnh có phạm vi cục bộ. Biến sẽ tồn tại cho toàn bộ chương trình chạy tương tự như biến toàn cục, nhưng sẽ chỉ có thể truy cập được trong khối mã được khai báo. Đây là ví dụ tương tự, chỉ có một thay đổi. count
bây giờ được khai báo là một biến tĩnh bên trong loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Điều này sẽ không biên dịch vì hàm inc()
không có quyền truy cập count
.
Các biến toàn cầu, tuy có vẻ hữu ích, đi kèm với một số cạm bẫy. Những thứ này thậm chí có thể gây ra thiệt hại khi viết các chương trình có thể tương tác với môi trường xung quanh. Đây là một ví dụ rất cơ bản về một cái gì đó rất có thể xảy ra, ngay khi các chương trình bắt đầu lớn hơn. Một hàm có thể vô tình thay đổi trạng thái của một biến toàn cục.
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;
}
Những trường hợp như vậy rất khó để gỡ lỗi. Đây loại vấn đề tuy nhiên, có thể dễ dàng được phát hiện, bằng cách đơn giản sử dụng một biến tĩnh.
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;
}