#include 꺽쇠(<...>), 쌍따옴표("...") 차이

Mark Lee·2021년 11월 23일
0

C++

목록 보기
1/2

개인적으로 SW를 정식으로 배운 개발자는 아니기 때문에, 가끔 아주 기본적인 부분에 있어 의문이 들 때가 있습니다. 그 중에 하나가 제목에 적힌 대로, 헤더 파일을 include할 때 "꺽쇠(<>, Angle Bracket)를 사용하느냐, 쌍따옴표("", double quotes)를 사용하느냐" 입니다.

실제 코딩을 해보면, 둘 다 에러가 나지 않기 때문에 구현 상의 차이는 없습니다. 하지만 기억에 전 직장에서 꺽쇠를 쓰는 것을 더 권장 받은 적이 있습니다.

시간 날 때, 이 부분에 대한 검색을 진행해 보았고,
C++ ISO Standard에 적힌 아래 문구를 찾을 수 있었습니다.
물론, ISO Standard 자체가 유료이기 때문에 정식 버전을 본 것이 아니라 2011년도 "16.2 Source file inclusion"의 일부가 인용된 것이기에 지금은 다를 수 있지만, 이런 건 자주 변경되는 것이 아니기에 지금도 같다고 생각됩니다.

2 A preprocessing directive of the form

#include <h-char-sequence>

searches a sequence of implementation-defined places for a header identified uniquely by the specified sequence between the < and > delimiters, and causes the replacement of that directive by the entire contents of the header. How the places are specified or the header identified is implementation-defined.

3 A preprocessing directive of the form

#include "q-char-sequence"

causes the replacement of that directive by the entire contents of the source file identified by the specified sequence between the " delimiters. The named source file is searched for in an implementation-defined manner. If this search is not supported, or if the search fails, the directive is reprocessed as if it read

#include <h-char-sequence>

with the identical contained sequence (including > characters, if any) from the original directive.

먼저, 꺽쇠를 쓰는 경우를 보면, 'implementation-defined places' 에서 헤더 파일을 검색한다고 되어 있습니다. defined place라고 명기되어 있으며, 이는 우리가 프로젝트 설정(Visual Studio 기준)에서 include path를 지정한 위치에서 헤더 파일을 찾는 다는 말입니다.
그리고 쌍따옴표를 쓴 경우는 'implementation-defined manner'에서 헤더 파일을 검색한다고 되어 있습니다. defined manner는 더 찾아보니, 현재 include를 시도하는 파일 위치를 기준으로 좀 더 넓게 검색을 한다는 의미입니다. 만약 여기서 실패를 할 경우에는 위 꺽쇠를 사용하는 경우, 지정 위치에서의 검색을 다시 시도한다고 되어 있습니다.

즉, 쌍따옴표를 쓰는 경우가 좀 더 광범위한 경우가 됩니다. 그러면 왜 꺽쇠를 쓰도록 권장 받았을까 하는 의문이 든다.
이는 전처리 명령어(Preprocessor Directives) 관점에서 보면 이해를 할 수 있습니다. C++에서는 #으로 시작하는 구문의 경우, compile전에 말 그대로 전처리를 하도록 되어 있는데, 쌍따옴표를 사용한 #include 전처리의 경우, 일단 파일 위치 기준으로 검색을 한 이후에, 지정 위치에서 검색을 하는 순서로 진행이 되는데, 복잡한 솔루션의 경우, 이는 compile 작업 자체의 성능 저하를 가져오는 요인이 됩니다.
관리적인 관점에서 봤을 때도, 지정되지 않은 위치(관리되지 않은 위치)에 존재하는 헤더 파일이 쌍따옴표로 인해 검색되어 처리가 된 경우에는 배포 등에 있어 누락될 가능성이 있으므로 분명 권장되지 않을 수 있어 보입니다.

결론은 습관적으로 꺽쇠를 쓰는 것이 나아 보인다 입니다.

profile
C++/C#, Python을 주로 사용하는 개발자입니다. Engineering 알고리즘 개발을 주 업무로 하고 있습니다.

0개의 댓글