[C/C++] 헤더파일의 본질

그림자왕국·2020년 10월 3일
0

C++

목록 보기
15/24

헤더 포함(#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! "여러 번 정의된 기호(심볼)가 있습니다."
};
-----------
profile
언리얼 엔진 매니아입니다.

0개의 댓글