1.10 외부변수(External Variables and Scope)-
위 프로그램의 main에는 longest등의 변수가 있는데 이 변수들은 main 함수 내에서만 의미를 가진다 다른 함수에서 같은 이름의 변수를 사용하더라도 main에 있는 것과는 전혀 별개의 것이 된다는 사실은 앞에서도 설명했다 이런변수를 locar variable 또는 automatic 변수라고도 한다 지역변수의 다른의미는 4장에서 설명한다
프로그램을 작성하다 보면 여러 함수에서 공통으로 사용되는 변수가 필요한 경우가 있다 이런 변수를 global 변수라고 하고 공통변수를 정의할때 extern 명령어를 사용한다 이런 변수는 함수의 바깥에서도 정의해야 하고 그 변수를 사용하는 각 함수에서도 정의되어야 한다. 가장 긴 행을 찾는 프로그램을 longest, max, line의 세 변수를 공통으로 사용하도록 프로그램을 고치면 다음과 같다
#include <stdio.h>
int power(int m,int n);
#define MAXLINE 1000 /* maximum input line size */
int max; /* maxinum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
int my_getline(void);
void copy(void);
/* print longest input line; specialized version */
int main(void)
{
int len; /* current line length */
extern int max;
extern char longest[];
max = 0;
while ((len = my_getline( )) > 0)
if (len > max) {
max = len;
copy();
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* mygetline: specialized version */
int my_getline(void)
{
int c = 0, i;
extern char line[];
for (i=0; i<MAXLINE-1 && (c=getchar()) !=EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n') {
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
/* copy: specialized version */
void copy(void)
{
int i;
extern char line[],longest[];
i = 0;
while ((longest[i] = line[i]) != '\0')
++i;
}
프로그램 첫부분에서 변수를 선언하고 있다 각 함수에서 필요한 공통변수는 extern 이라는 문장으로 선언함을 알수있다
공통변수를 사용하는 함수가 공통변수 선언과 같은 파일에 들어있는 경우에는 함수내에서 extern 선언해 주지 않아도 된다. 그러므로 위 프로그램의 함수 내에 들어있는 extern 선언은 생략할수 있다 하지만 만약 copy 함수가 다른파일에 있다면 copy 함수 내에 extern 선언은 꼭 있어야 한다 그러면 라이브러리에 있느 함수를 사용할 경우 그함수에는 사용하는 모든 공통변수는 프로그램 처음에 선언해 주어야 한다는 말이 된다.
#include <stdio.h>
이렇게 하면 stdio(표준입출력 라이브러리) 에있는 함수에서 사용되는 공통변수는 다 선언된 것이다 이것은 뒤에서 더 자세히 설명하기로 하고 짚고 넘어가야 할부분은 getline과 copy에 있는 void이다
함수가 void로 선언되어있다면 함수 기능이 수행된후 리턴값이 없다는 것을 의미 한다. 그리고 변수의 선언도 앞과 다른것을 알수있다 이정도만 알고 4장에서 자세히 보자
프로그램을 작성할때 모든변수를 공통으로 선언하면 매개변수도 없고 원하는 떄 사용할수 있어 좋을것이라 생각할지 모르지만 변수를 혼동하기 쉽고 일반성이 줄어든다는 단점이 있다 예를 들어 다른곳에서 copy 함수를 사용하려면 copy 함수가 어떤 변수가 있는지를 파악하고 선언해야 한다.
지금까지 C언어의 전체적 구조에 대해서 알아보았다 정말 구조일 뿐이고 자세한것은 2장부터 설명한다
2장에 가기전에 예제에 도전해 보기 바란다
예제 1-20 파일 중에 있느 tab을 같은 길이의 빈칸으로 대치하는 프로그램을 작성하라 매 n번째 위치에 tab지점이 있다고 가정한다 프로그램 이름은 dtab으로 하라.
예제 1-21 빈칸이 연속으로 나올때 그것을 tab 문자로 바꾸는 프로그램을 작성하라 즉 예제 1-20의 역작용을 하는 entab 프로그램을 작성하되, 사용되는 tab 문자의 개순느 될 수 있는 대로 적게 하라.
예제 1-22 한행의 n번쨰 열 앞에 나타나는 빈칸 아닌 문자 중에서 마지막 문자의 뒷부분을 다음 행으로 보내어 한 행을 두개 이상의 행으로 만드는 프로그램을 작성하라.
예제 1-23 C 프로그램에서 모든 설명문을 없에는 프로그램을 작성하라 인용부호 속에 있는 문자열에 주의하라.
예제 1-24 기본적인 C문법을 검사하는 프로그램을 작성하라 검사대상은 짝이 맞지 않는 괄호 ,중괄로, 그리고 인용부호,escape 문자, 설명문 표시 등이다.