가장 기본적인 차이점은 범위입니다.
첫 번째 경우 전역 변수를 선언하는 것입니다. 정의 후 모든 범위에서 액세스 할 수있는 변수입니다.
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;
}