C 언어에서 전역 변수의 재선언(re-declaration)이 가능한지, 그리고 어떤 조건에서 오류가 발생하는지 살펴보겠습니다. 먼저 지역 변수의 경우부터 확인한 뒤, 전역 변수와 비교해 보겠습니다.
지역 변수의 재선언: 컴파일 오류 발생
다음 코드는 같은 함수 내에서 변수를 두 번 선언하는 예제입니다.
#include <stdio.h>
int main(){
int a;
int a = 50;
printf("a is : %d\n", a);
}
출력 결과
[Error] redeclaration of 'a' with no linkage
실행 결과를 보면 알 수 있듯이, 지역 변수는 재선언할 수 없습니다. 같은 범위(scope) 안에서 동일한 이름의 변수를 다시 선언하면 컴파일러가 오류를 발생시킵니다.
전역 변수의 재선언: 초기화되지 않은 경우 허용
그렇다면 전역 변수는 어떨까요? 아래 코드는 전역 변수를 선언한 뒤, 값을 초기화하며 다시 선언하는 예제입니다.
#include <stdio.h>
int a;
int a = 50;
int main(){
printf("a is : %d\n", a);
}
출력 결과
a is : 50
흥미롭게도 이 경우에는 아무런 오류가 발생하지 않습니다. 첫 번째 선언에서 변수가 초기화되지 않은 상태(정의만 존재)였기 때문에, C 표준은 이를 하나의 정의로 간주하고 두 번째 선언을 허용합니다. 이는 전역 변수의 tentative definition(잠정적 정의) 규칙에 따른 동작입니다.
초기화된 전역 변수의 재선언: 재정의 오류 발생
그렇다면 첫 번째 선언 시점에 이미 값이 할당되어 있다면 어떻게 될까요? 아래 예제를 통해 확인해 보겠습니다.
#include <stdio.h>
int a = 10;
int a = 50;
int main(){
printf("a is : %d\n", a);
}
출력 결과
[Error] redefinition of 'a'
이번에는 'a'의 재정의(redefinition) 오류가 발생했습니다. 이미 값으로 초기화된 전역 변수를 다시 초기화하며 선언하면, 컴파일러는 이를 중복 정의로 판단하여 컴파일을 거부합니다.
정리
결론적으로 C 언어에서 전역 변수의 재선언은 다음과 같은 규칙을 따릅니다.
- 지역 변수: 재선언 자체가 불가능하며, 항상 컴파일 오류가 발생합니다.
- 전역 변수(초기화 없이 선언): 이후 초기화와 함께 다시 선언해도 오류가 발생하지 않습니다.
- 전역 변수(초기화 후 재선언): 값이 이미 할당된 상태에서 다시 선언하면 재정의 오류가 발생합니다.
따라서 전역 변수는 초기화되지 않은 상태일 때에만 재선언이 허용된다는 점을 기억하시기 바랍니다.