Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 전역 변수 재선언 프로그램 – C와 C++의 동작 차이 완벽 비교

C와 C++은 문법이 매우 비슷해 보이지만, 변수를 다시 선언(재선언)하는 상황에서는 서로 다르게 동작합니다. 이 글에서는 다음 네 가지 경우를 실제 코드와 실행 결과를 통해 비교해 보겠습니다.

  • 전역 변수를 초기화 없이 재선언하는 경우
  • 지역 변수를 초기화 없이 재선언하는 경우
  • 전역 변수를 초기화하면서 재선언하는 경우
  • 지역 변수를 초기화하면서 재선언하는 경우

각 사례마다 C 컴파일러와 C++ 컴파일러가 어떻게 반응하는지 하나씩 확인해 보세요.

1-A. C 프로그램: 초기화 없이 전역 변수 재선언하기

#include <stdio.h>

int var;
int var;

int main() {
    printf("Var = %d", var);
    return 0;
}

실행 결과

Var = 0

1-B. C++ 프로그램: 초기화 없이 전역 변수 재선언하기

#include <iostream>
using namespace std;

int var;
int var;

int main() {
    cout << "Var = " << var;
    return 0;
}

실행 결과

컴파일 오류: 'int var'가 이전에 이미 선언되었습니다

결과 분석: C는 초기화 없는 전역 변수의 재선언을 허용하며, 값은 기본값인 0으로 유지됩니다. 반면 C++은 같은 이름의 변수가 중복 선언되었다고 판단해 컴파일 오류를 발생시킵니다.

2-A. C 프로그램: 초기화 없이 지역 변수 재선언하기

#include <stdio.h>

int main() {
    int var;
    int var;
    printf("Var = %d", var);
    return 0;
}

실행 결과

오류: 'var'의 재선언 (no linkage)

2-B. C++ 프로그램: 초기화 없이 지역 변수 재선언하기

#include <iostream>
using namespace std;

int main() {
    int var;
    int var;
    cout << "Var = " << var;
    return 0;
}

실행 결과

오류: 'int var'의 재선언

결과 분석: C와 C++ 모두 같은 스코프 안에서 지역 변수를 재선언하는 것을 허용하지 않습니다. 두 프로그램 모두 컴파일 단계에서 실패합니다.

3-A. C 프로그램: 초기화하면서 전역 변수 재선언하기

#include <stdio.h>

int var;
int var = 10;

int main() {
    printf("Var = %d", var);
    return 0;
}

실행 결과

Var = 10

3-B. C++ 프로그램: 초기화하면서 전역 변수 재선언하기

#include <iostream>
using namespace std;

int var;
int var = 10;

int main() {
    cout << "Var = " << var;
    return 0;
}

실행 결과

main.cpp:7:9: 오류: 'int var'의 재선언

결과 분석: C는 전역 변수를 초기화하면서 재선언해도 컴파일이 정상적으로 진행되며, 초기화된 값이 그대로 출력됩니다. 하지만 C++은 역시 컴파일 오류로 처리합니다.

4-A. C 프로그램: 초기화하면서 지역 변수 재선언하기

#include <stdio.h>

int main() {
    int var;
    int var = 10;
    printf("Var = %d", var);
    return 0;
}

실행 결과

오류: 'var'의 재선언 (no linkage)

4-B. C++ 프로그램: 초기화하면서 지역 변수 재선언하기

#include <iostream>
using namespace std;

int main() {
    int var;
    int var = 10;
    cout << "Var = " << var;
    return 0;
}

실행 결과

오류: 'int var'의 재선언

결과 분석: 지역 변수는 초기화 여부와 무관하게 C와 C++ 모두 재선언을 허용하지 않습니다. 두 언어 모두 컴파일에 실패합니다.

전체 결과 요약

구분CC++
전역 변수 재선언 (초기화 없음)허용 (값은 0)컴파일 오류
지역 변수 재선언 (초기화 없음)컴파일 오류컴파일 오류
전역 변수 재선언 (초기화 있음)허용컴파일 오류
지역 변수 재선언 (초기화 있음)컴파일 오류컴파일 오류

마무리

핵심 차이는 파일 범위(전역 영역)에 있습니다. C는 초기화 식이 없는 전역 선언을 '잠정적 정의(tentative definition)'로 취급하여 여러 번 등장하는 것을 허용하고 이를 하나의 정의로 통합합니다. 반면 C++은 하나의 이름에 대해 프로그램 전체에서 단 하나의 선언만 허용하기 때문에 재선언 자체가 불가능합니다.

반면 함수 내부의 지역 변수는 같은 스코프에서 두 번 선언될 수 없다는 점에서 C와 C++의 동작이 동일합니다. 따라서 실무에서는 같은 이름의 변수를 반복 선언하지 않도록 항상 주의하는 것이 좋습니다.