본문 바로가기

나는 공돌이다

헤더파일 중복 막기

#ifndef MY_HEADER_H

#define MY_HEADER_H

...

...

#endif


영어로는 include guard라고 부르는 것 같다. (참고: 위키페이지)


처음엔 my_header.h 라는 파일명과 MY_HEADER_H 사이에 어떤 관계가 있는 줄 알았다. 밑줄이 wildcard characeter 역할이라도 하는건가 싶어서 구글링을 해봤으나 원하는 정보는 찾을 수 없고... 이 기법은 헤더파일 작성에 있어 거의 공식 수준인데 이렇게까지 검색이 안 되나 싶어 이상하다 싶던 찰나,


"잠깐, 꼭 파일명이랑 관련된게 아니라도 상관없잖아...?"


그렇다. 그냥 식별자 역할을 할 뿐이었다. 일종의 태그. MY_HEADER_H라는게 정의된 적이 있냐 없냐를 판단하기 위한 것일 뿐, 이름은 뭘 해도 상관은 없다. 그럼에도 불구하고 헤더파일과 같은 이름으로 만드는 이유는? 왜긴, 다른 식별자랑 안 겹치게 하려는 거지. 파일명이 동일한 두 개의 헤더파일이 있을리가 없으니, 식별자를 헤더와 같게 하면 식별자가 겹칠 걱정도 없다. 하여튼 사람들 머리 좋아.


이 간단한 걸 왜 난...


참고로, #ifndef MY_HEADER.H는 안 되는 것 같다. 저렇게 쓰면 .H는 무시하고 MY_HEADER만 되는 듯. 돌려보진 않았다. 하지만 저렇게 쓰면 자동완성으로 #endif // MY_HEADER가 나오는걸 봐선 어느 정도 유추가 가능하다. 헤더 식별자를 모두 대문자로 하고 밑줄을 쓰는건 말 그대로 관습, convention이라고 한다.


아, 그리고 밑줄문자(_)는 underscore라고 부르더라. 지금까지 underbar인줄... (참고: 위키페이지)


그리고 하나 더. 이 식별자를 underscore로 시작하지 말라고 한다. 시스템이 쓰려고 미리 잡아놨단다.


참고한곳들: 링크1, 링크2, 링크3, 링크4