[C++] 14. 정적변수&외부변수 (분할구현 문제 해결)

김김김🍅·2025년 9월 1일

C++공부로그

목록 보기
14/23

🍅 문제발생

  • func.h
// 함수 선언만 한 것 (반환은 없음)
int Add(int a, int b); 
int Sub(int a, int b);

int global= 0;
  • func.cpp
#include "func.h"


int Add(int a, int b)
{
  global = 10;
  return a + b;
}

int Sub(int a, int b) // 여러 함수를 만들어 놓을 수 있음
{
  return a - b;
}
  • main.cpp
#include "func.h"

int main()
{
  int data = Add(10, 20);   // 호출

  global = 20;
  return 0;
}

🍅 발생 원인

만일 위와 같이 global을 선언할 경우 오류가 발생

  1. 헤더 파일의 역할: 헤더 파일은 여러 소스 파일(.cpp)에서 공유될 함수, 클래스, 변수 등의 선언을 담는 역할

  2. 포함(Include)의 원리: main.cpp와 func.cpp는 #include "func.h"를 통해 헤더 파일의 내용을 그대로 복사해옴. 이 과정에서 global 변수의 정의가 각 파일에 중복되어 생성.

  3. 다중 정의 오류 (Multiple Definition Error):

  • main.cpp 파일에는 int global = 0;가 포함
  • func.cpp 파일에도 int global = 0;가 포함

컴파일러는 각 파일을 독립적으로 컴파일한 후, 링커가 이들을 합치는 과정에서 동일한 이름의 전역 변수 global이 두 번 정의된 것을 발견하고 오류를 발생

🍅 해결 방법

정적 변수 & 외부변수


정적 변수 & 외부 변수

정적 변수는 선언되는 위치에 따라 의미가 달라진다.

1. 정적변수 선언

1.1 아래와 같이 메모리가 할당 됨

1.2 정적변수를 선언해주는 이유

1.3 모든 파일에서 인식하는 정적변수

-> 외부변수를 사용해야함

2. 외부변수

1. common.h 파일

헤더파일에 g_iExtern 선언

단! 초기화는 하면 안됨!

2. 외부변서 초기화

  • 새로운 파일(.cpp)을 만들어도 되고
  • main이 있는 파일 위에서 초기화 및 선언 가능

3. main 에서 호출을 해주면

g_iStatic = 100;
g_iExtern = 500;
이라고 main 에서 선언하고
Add(0,0) 함수를 호출하면!

3. func 함수 결과 확인

결과는 아래와 같이 나옴
g_iSatic은 정적변수이기 때문에 func.cpp 위에서 선언한 g_iStatic = 0 값이 들어온 것이고,

g_iExtern은 외부변수였기때문에
main 에서 500넣어줬던 값이 나왔던 것!

정적 변수 (static) : 정적 변수는 차단과 방어의 역할
외부 변수 (extern) : 외부 변수는 공유를 위한 것


✅ 확인하기
Q. 외부변수와 정적변수의 쓰임에 대해 말해보시오

profile
🍅 토마토와 AI를 좋아하는 김서린입니다! 🧑🏻‍💻👩🏻‍💻👨🏻‍💻 🍅

0개의 댓글