헤더 포함(#include)이 없어도 foo를 main()에 선언해주기만 해도 컴파일이 된다!
void foo(); // not include!
int main() {
foo()
}
//////////////
void foo(){
}
아래처럼 함수 선언을 중복으로 해도 정상적으로 컴파일된다! 그 이유는 선언은 어셈블리단에선 아무런 영향이 없기 때문에 정의만 고유하다면 중복으로 선언해도 하나의 심볼로 귀결되기 때문이다.
void foo();
void foo(); // OK!
int main() {
foo();
}
하지만 클래스는 함수와 달리 중복 선언될 수 없다. (클래스 이름과 멤버함수 모두 중복 선언 불가)
class ABC {
void mem();
};
void ABC::mem(); // compile error!
위 처럼 클래스 외부에서도 다시 선언할 수 없다. 그래서 헤더파일에 #ifndef, #pragma 등의 전처리기를 붙여 클래스는 오직 한 번만 선언되게 전처리를 해준다.
-----------------
foo.h
void foo();
-----------------
foo.cpp
#include<foo.h>
void foo() {
cout << "hi << endl;
}
----------------
.main
#include<foo.h> // foo.h 코드를 그대로 복붙한다.
void foo();
foo(); // "hi" - 컴파일 성공
----------------
위와 같이 함수는 중복으로 선언될 수 있지만, 정의는 오직 프로젝트당 하나씩만 가능하다.
(#include와 상관없이 정의(심볼)는 프로젝트 내에서 고유해야만 한다.)
abc.cpp
void func(){
};
------------
def.cpp
void func(){ // compile error! "여러 번 정의된 기호(심볼)가 있습니다."
};
-----------