먼저 파일들을 다음과 같이 만듭니다.
a.h
extern int a;
void B();
a.cpp
#include "a.h"
int a = 0;
void B() {
a++;
}
main.cpp
#include "a.h"
int main() {
B();
a = 0;
return 0;
}
위의 #include 문은 a.h의 파일 내용을 해당 파일 내용에 포함한다는 뜻입니다.
실질적으로 a.cpp의 파일 내용은
extern int a;
void B();
int a = 0;
void B() {
a++;
}
가 됩니다.
그리고 위의 extern문은 a의 변수를 선언한다는 의미인데 여기서 선언한다는 것은 변수가 다른 곳에 정의되있는 것을 알려주는 역할을 합니다. 여기선 a.cpp에 a 변수가 정의돼있다는 것을 a.h의 extern문에서 알려주고 있기 때문에 main.cpp에서 a변수 정의문이 포함되어 있지 않아도 a변수를 사용할 수 있는 것입니다.
그런데 왜 그냥 extern문을 사용하지 않고 a.h에서 변수를 정의하기만 하는 것이 안되나면 main.cpp에도 a 정의가 있고, a.cpp에도 a 정의가 있으면 같은 이름의 변수를 중복 정의하기 때문에 오류가 납니다. 반면 선언 자체는 중복되어도 괜찮기 때문에 여러 파일에서 전역 변수를 사용하려면 선언이 필수적입니다.
그리고 함수도 마찬가지로 위와 같이 내용({}부분)을 빼고 선언할 수 있습니다.
그러면 이제 a.cpp의 변수 및 함수 정의 부분 앞에 static 문을 추가해보겠습니다.
a.cpp
#include "a.h"
static int a = 0;
static void B() {
a++;
}
다시 실행해 보면 오류가 날 것입니다. 왜냐하면 여기서 쓰인 static 문은 변수 및 함수의 사용 범위를 파일 한 개, 즉, a.cpp 내로 제한한다는 의미입니다. 마치 정적 변수가 그 함수 내에서만 사용 가능 한 것처럼요.
그리고 main.cpp 파일을 다음과 같이 수정합니다.
main.cpp
static int a = 0;
static void B() {
a++;
}
int main() {
B();
a = 0;
return 0;
}
이렇게 해서 실행하면 a 변수와 B 함수가 중복돼서 오류가 날 것 같지만 그렇지 않습니다. 그 이유는 a.cpp의 a, B와 main.cpp의 a, B는 각각 사용 영역이 파일 하나로 한정되어 있기 때문에 서로 별개입니다. 즉, 다른 함수에서 같은 이름의 변수를 선언하는 것과 같이 이름 중복 문제가 없습니다.
그리고 선언, 정의를 할 때 주의할 점은
int main() {
//i=2;불가능
//Func();불가능
return 0;
}
void Func() {
}
int i=0;
변수, 함수를 사용하기 전에 선언 또는 정의를 해주어야 합니다.