2020년 3월 21일 토요일

C++의 소스파일 확장자인 .cxx, .hpp, .h, .hxx 차이

출처: https://kugistory.net/104 [Kugi's Blog]


C++를 이용해 OPENCV 등의 오픈 소스 라이브러리를 사용하거나,
CMake를 이용해서 범용 프로젝트를 빌드하거나 할 때면
다음과 같은 소스코드 파일 확장자들을 볼 수 있다.

.c
.h
.cc
.cpp
.c++
.cxx
.hpp
.hxx
.hh
.h++
.H


일반적으로 C++ 언어를 처음 익히게 되면 선언을 구현한 헤더파일은 .h 확장자를 달고,
정의를 구현한 소스파일은 .cpp 확장자를 다는 것이라고 배운다.

C++가 아닌 C에서는 .cpp 대신에 .c 확장자를 쓴다는 것도 알고 있을 것이다.

그래서 위 확장자들 중 이 세 개를 제외한 나머지 생소한 확장자들을 접하게 되면 도대체 무슨 용도인지 몰라 지레 겁을 먹는 경우가 많다.
그러나 다행스럽게도 이 파일들은 모두 우리가 알고있는 그 C++ 문법을 따르고 있다.
예를들어 VC++(비쥬얼 스튜디오 C++ 컴파일러)에서 .cpp 확장자와 .cxx 확장자는 똑같은 의미이다.
단지 여러 개발 환경에서 쓰이게 되면서 이처럼 다양한 형태의 확장자로 나뉘게 된 것 뿐이다. 확장자라는게 단지 파일의 용도를 쉽게 구별하기 위한 용도로 쓰이는 것이기 때문에 내용만 올바르다면 사실상 전혀 처음보는 확장자를 달더라도 문제는 되지 않는다.

 본래 처음 C++가 만들어졌을 때, 파일 확장자는 .c++를 사용하도록 되어있었다. 그런데 특정 OS(운영체제)에서는 확장자이름에 '+'를 사용할 수 없었기 때문에 '+' 대신에 'x'를 넣어 .cxx라고 쓴 것이다.
눈치 챈 사람도 있겠지만 'x'를 사용한 이유는 '+'를 옆으로 살짝 돌려 놓은 것처럼 생겼기 때문이다. MS-DOS와 MS-Windows에서는 .cpp를 사용하였는데 현재는 이것이 거의 표준처럼 되어있다. 관례적으로 파일 확장자 이름이 .c나 .h가 변형된 것 처럼 생긴 확장자라면 C++ 문법이 적용됬음을 의미한다고 보면 된다. 또한 iostream, vector 처럼 확장자를 표시하지 않는 스타일도 있다.

그럼 .hpp 또는 .hxx 확장자는 왜 굳이 사용했을까? 일반적으로는 C++에서도 헤더파일의 확장자 이름은 C에서처럼 .h를 사용한다.
다만 C++ 문법중에는 정의와 선언을 분리하기 어려운 상황이 몇 가지 있다.
그 중 한가지가 바로 템플릿(template)을 구현할 때이다. 템플릿의 타입이 컴파일시간에 지정되므로 헤더파일에 정의가 구현되어야 한다. 그래서 이런 경우에는 특별히 C++ 문법을 썼음을 확실히 명시하기 위해 .hpp, h++, .hxx 등을 사용하는 것이다. 템플릿 정의의 경우 .txx, .tpp, .tpl이라고 표시하기도 한다. 인라인 함수 정의에는 .ii, .ixx, .ipp, .inl을 쓰기도 한다.


 확장자는 아니지만 다른 예도 있다. makefile 매크로에서는 다음과 같은 의미로 사용한다.

CPPFLAGS : 전처리기(Pre-Processor) 플래그
CFLAGS : C 컴파일러(Compiler) 플래그
CXXFLAGS : C++ 컴파일러 플래그
LDFLAGS : 링커(Linker) 플래그
CC : C 컴파일러 경로
CPP : 전처리기 경로
CXX : C++ 컴파일러 경로
LD : 링커 경로


출처: https://kugistory.net/104 [Kugi's Blog]

댓글 없음:

댓글 쓰기