반응형

함수 선언에서는 extern 지정자와 static 지정자를 사용하여 기억 클래스를 지정할 수 있다. 대상의 함수를 다른 소스 파일에서 호출할 수 없게 은폐하려면, static 지정자 함수를 선언하면 좋을 것이다.

함수의 가시성

함수는 변수와 달리 내부 레벨이라는 것이 존재하지 않는다. 즉, 함수는 항상 글로벌 지속되어야하며 동일한 파일이면 어디서든 참조할 수 있다. 물론 함수를 호출하기 위해서는 그 이전에 프로토타입 선언되지 않으면 안되는 것은 "함수의 선언"에서 해설했다.

그러나 변수뿐만 아니라 여러 파일을 동시에 컴파일할 때, 함수 이름 충돌 문제가 발생한다. 실은 이를 해결하기 위해 함수도 기억 클래스가 존재하고 있는 것이다. 함수에 지정할 수 있는 기억 클래스는 static과 extern 중 하나이다.

static 기억 클래스를 가진 함수는 그 함수가 정의되어 있는 파일의 함수에서만 호출할 수 있다. 다른 파일의 함수에서 static 함수를 호출할 수 없다. 반대로 extern 기억 클래스와 함수는 다른 파일의 함수에서 호출할 수 있다. 지금까지 처럼 함수의 기억 클래스를 생략한 경우 extern이 암시적으로 채용된다.

코드1

#include <stdio.h>

void Function1(void);
void Function2(void);

int main() {
    /*Function1();  /*error*/
    Function2();
    return 0;
}

코드2

static void Function1() {}
extern void Function2() {}

코드1과 코드2를 동시에 컴파일하면 main() 함수에서 Function2()를 호출 할 수 있지만 Function1() 함수는 코드1에서 보이지 않기 때문에 호출할 수 없다. 주석 처리되어 있는 Function1()의 주석을 해제하고 컴파일하면 오류가 있음을 확인할 수 있다. Function1() 함수는 static 기억 클래스를 가지고 있기 때문에 외부 파일에서 보이지 않는다.

이것은 어느 한 곳에서 사용하는 특정의 처리에 특화된 함수를 만들 때 유용한다. 특정 파일의 특정 처리에 특화된 독립성이 낮은 함수의 경우는 이름 충돌을 피하기 위해서 static 기억 클래스를 지정하는 것이 좋다.

반응형

+ Recent posts