最基本的区别是范围。
在第一种情况下,您要声明一个全局变量。在定义之后,它是在每个范围内均可访问的变量。
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;
}