#include가 없는데 어떻게 없는 class 참조를 했지?

Gunjoo Ahn·2022년 11월 3일
0

📌문제: 객체를 선언한 헤더파일 누락, 그런데 정상 컴파일?

한창 사용자가 메모리 제한을 설정할 수 있는 기능을 구현하는 중에 기존 헤더 파일에서 이상한 부분을 발견하였다. 기존 헤더 파일인 인코딩, 디코딩을 하는 헤더 파일에 정작 인자로 받는 Message 클래스가 선언된 헤더 파일을 #include하지 않고 있던 것이었다.

어라? 이거 실수했는데 어떻게 지금까지 컴파일되고 정상 동작을 한 것이지?

👊원인 몰색

다른 헤더 파일에 포함?

가장 먼저 떠오른 것은 당연히 다른 헤더 파일에 포함되어 있었는지 확인하는 것이었다. 문제는 #include한 모든 헤더 파일이 #include<sstream>과 같이 기본 헤더뿐이었다는 것이다. 의심할 여지 없이 다른 헤더 파일에 포함되어있지 않았다.

도대체 어떻게 #include없이 객체를 볼 수 있는 거지?

헤더파일을 다 지워보자

원인을 못찾겠으니 일단 확실히 하기 위해서 모든 헤더 파일을 지웠다.
놀랍게도 컴파일이 되었다!
헤더 파일이 없이 참조가 가능하다고..?

#include 동작 원리를 다시 생각해보자

https://programfrall.tistory.com/21

코드 복사 붙여넣는 것은 알던 것인데.. 혹시 include하는 cc 파일 위치에 Message 클래스 헤더 파일이 있기 때문인건가?

👏실험해 보니 맞았다

헤더 파일에 직접 #include하지 않아도 #include되는 위치에, 즉 코드가 붙여넣어지는 위치에 클래스가 선언된 헤더 파일이 있으면 컴파일이 정상적으로 된다.

문제는 모든 코드에 두 개의 헤더 파일이 포함되어 있어야지만 동작한다는 것인데, 이번에는 우연치 않게 Encoder, Decoder와 Message 객체의 관계였기에 거의 무조건 같이 include하는 상황이었어서 문제 없이 동작하고 있던 것이다.

감상

클래스 타입 참조를 시도하는 코드가 헤더 파일이었기에 발생할 수 있던 이슈였다.

전처리기는 아직까지도 익숙해지지 않는 것같다. 특히 매크로는 왜이리 파악하기 어려운지..

profile
Backend Developer

0개의 댓글