C++ extern 저장소 클래스란?
extern 저장소 클래스 지정자는 여러 소스 파일이 함께 사용할 수 있는 객체를 선언할 수 있게 해주는 기능입니다. extern으로 선언된 변수는 현재 소스 파일의 이후 부분에서 자유롭게 사용할 수 있습니다. 다만 extern 선언은 변수의 정의(definition)를 대체하는 것이 아니라, 외부 어딘가에 실제로 정의되어 있는 변수를 컴파일러에게 알려주는 역할을 한다는 점을 기억해야 합니다.
extern 선언이 위치할 수 있는 곳
extern 선언은 함수 외부에 작성하거나 블록의 시작 부분에 위치시킬 수 있습니다. 만약 선언이 함수를 설명하는 경우이거나, 함수 밖에서 외부 링크(external linkage)를 가진 객체를 설명하는 경우에는 extern 키워드를 생략해도 무방합니다.
파일 범위와 링크 규칙
파일 범위(file scope)에 이미 특정 식별자에 대한 선언이 존재한다면, 블록 내부에서 동일한 식별자로 발견되는 extern 선언은 그와 같은 객체를 참조합니다. 반대로 파일 범위에 해당 식별자의 다른 선언이 전혀 없다면, 이 식별자는 외부 링크를 갖게 됩니다.
C++에서의 제약 사항
C++에서는 extern 저장소 클래스 지정자의 사용이 객체 또는 함수의 이름으로 엄격히 제한됩니다. 따라서 타입 선언과 함께 extern 지정자를 사용하는 것은 허용되지 않으며, extern 선언은 클래스 범위(class scope) 안에 나타날 수 없습니다.
extern 키워드로 여러 파일에서 변수 공유하기
extern 키워드를 활용하면 서로 다른 소스 파일 간에 하나의 전역 변수를 손쉽게 공유할 수 있습니다. 아래 예제를 통해 실제 사용 방법을 확인해 보겠습니다.
file3.h
extern int global_variable; /* 변수의 선언 */
file1.c
#include "file3.h" /* 선언이 여기서 사용 가능해짐 */
#include "prog1.h" /* 함수 선언 */
/* 변수가 여기서 정의됨 */
int global_variable = 37; /* 정의가 선언과 일치하는지 검사됨 */
int increment(void) {
return global_variable++;
}file2.c
#include "file3.h"
#include "prog1.h"
#include <stdio.h>
void use_it(void)
{
printf("Global variable: %d\n", global_variable++);
}위 구조를 살펴보면, 헤더 파일(file3.h)에는 변수의 선언만 포함하고, 실제 정의는 단 하나의 소스 파일(file1.c)에 두는 것이 핵심입니다. 이렇게 하면 여러 파일이 동일한 변수를 안전하게 참조할 수 있으며, 중복 정의로 인한 링크 오류도 예방할 수 있습니다.
마무리
extern 키워드의 본질을 아주 잘 보여주는 StackOverflow 질문이 있으니, 더 깊이 있는 이해를 원한다면 아래 링크를 참고하시기 바랍니다.
How do I use extern to share variables between source files? - Stack Overflow