전방선언
어떤 함수나 클래스를 사용하기 전에 앞에 적어둬서 이런 클래스/함수 가 있다- 하고 알려주는 것.
함수의 원형만 가능하고,
클래스의 경우는 이런클래스가 있다- 밖에 모르기 때문에 포인터로 밖에 선언하지 못한다.
1
2
3
4
5 |
class A; //전방선언
class B{
public:
A* ptr;
} |
cs |
전방선언 왜 사용할까?
1. 예를 들어 Hello.cpp랑 Hello.h가 있다 하자. Hello.cpp에서는 Hello.h를 포함해야 하는데 참조하려는 헤더파일에
변경이 생겨도 참조하는 헤더파일에서는 재컴파일이 이루어지지 않는다.
2. 헤더파일을 포함하지 않고 포인터로 변수를 선언할수 있는데- 이게 중복된 include를 피할수 있게 해준다.
1
2
3
4
5 |
#include"b.h"
class A
/*************/
#include"a.h"
class B |
cs |
이렇게 있다면 보통은 중복을 안하려고 #pragma once를 붙이는데 그러면
1
2
3
4
5
6
7 |
#pragma once
#include"b.h"
class A
/************/
#pragma once
#include"a.h"
class B |
cs |
이렇게 된다. 이게 왜 문제일까? 과정을 보면,
1)b.cpp를 컴파일한다. b.cpp 상단에는 b.h가 include되어있으니까 컴파일러는 b.h를 포함시킨다.
2)b.h를 가보았다. a.h가 include 되어있다. a.h도 포함해야겠네.
3)a.h를 가보았다. b.h가 include 되어있다. 아까 b.cpp에서 include 했는데.. 또해야겠네?
4)근데 a.h 에 #pragma once가 있잖아. 그럼 헤더파일은 한번만 불러야지.
: 그럼 a.h에 #include "b.h"는 왜있는거지? ==> 불필요
1~4번 컴파일 과정을 보니까 a.h에 있는 #include "b.h"가 불필요한거 같아서 지우려고 했다.
그런데 class A에 멤버변수로 B b 클래스가 있으면?
#include "b.h"를 지워버리면 B가 있는지 알수가 없어서 에러가 뜰텐데.
#pragma once를 없애면? 두번 중복되어서 에러가 더뜬다.
그래서 나온게 전방선언.
1
2
3
4
5
6
7
8
9
10
11 |
#pragma once
class B
class A{
B* ptr;
}
/************/
#pragma once
class A
class B{
A* ptr;
} |
cs |
이렇게.
컴파일 속도면에서나 헤더를 엉키지 않게 하는면에서 효율이 있다.
물론 헤더는 각각의 소스파일에 포함해야하고.
https://www.slideshare.net/Ruvendix1/google-coding-guide
근데 또 구글코딩 가이드를 보면
전방선언보다 #include를 활용하라고 한다.
전방선언을 이용하면 불필요한 #include를 줄일 수 있지만 실질적인 성능개선 효과는 없고
컴파일 타임을 줄이는 효과만 있다고.
그냥 적당히 써야징:>
책보다가 한국어인데 못알아들어서 정리하는 전방선언 ㅎㅎ..
'프로그래밍 > 언어들' 카테고리의 다른 글
Dictionary<TKey, TValue> (0) | 2017.03.23 |
---|---|
JavaScript)기초 (0) | 2017.03.22 |