4.6 정적 변수(Static Variables)
stact.c 내에 있는 sp.val 같은 변수나 getch.c 내에 있는 buf,bufp 같은 변수는 각각의 파일에서만 사용되고 다른 파일에서는 사용되지 않는 변수이다.
외부형 변수나 함수에서의 static 선언은 그 파일 내에서만 통용된다. 따라서 외부형 정적변수는 getch-ungetch 의 프로그램에서 buf, bufp 같은 변수 이름을 숨길수 있도록 해준다 이 변수들은 두 프로그램에서 공유되도록 외부형이어야 하지만,getch나 ungetch를 사용하는 사람들에게 혼란을 일으키지 않도록 숨기는 것이 좋다. 정적 변수는 정상적인 변수선언 앞에서 static 이란 선언을 함으로써 얻어진다 만일 두 루틴과 두 변수가 다음과 같이 한 파일에서 컴파일 된다면
static char buf[BUFSIZE]; /* buffer for ungetch */
static int bufp = 0; /* next free position int buf */
int getch(void) { ... }
void ungetch(int c){ ... }
다른 루틴들은 buf나 bufp 변수를 사용할수 없다. 따라서 같은 프로그램 내의 다른 파일에 있는 똑같은 이름으로 인해 혼란을 겪지 않을 것이다. 같은 방법으로 sp와 val 변수에 static 선언을 함으로써 push와 pop 동작에 사용되는 변수들을 숨실수 있다. 외부 정적 선언은 변수에 주로 사용되지만 함수에도 사용될 수 있다 함수 이름은 공통적이며, 프로그램 안의 모든 부분에서 사용할수 있다. 그러나 함수가 static으로 선언 되면 그 이름은 그것이 정의된 파일 이외에는 사용할 수가 없게 된다. 정적변수 선언은 내부형 변수에도 사용된다 정적으로 선언된 내부형 변수들은 자동변수와 거의 같은 기능을 가지고 있으나 자동 변수와는 달리 항상 기억장소가 할당되어 있으며,소멸되지 않는 차이점이 있다. 즉 함수가 호출될 떄 그 전에 호출될 떄의 값을 가지고 있게 된다(보통의 자동변수는 0 등으로 초기화 된다).
예제 4-11 getop 프로그램을 ungetch를 사용하지 않는 구조로 개선하라. 힌트 내부 정적 변수를 사용하라