기존 빌드
- c++빌드 과정
- 헤더 파일의 내용이 복사되어 파일에 들어감 <- "Transition Unit" 방식
모듈 빌드(import)
참고 : devshovelinglife_모듈
- 한번 도입되며 비용이 거의 없음
- 재사용 가능하기에 컴파일 시간 단축
- 여러 소스 파일에서 재사용 가능하기에 코드 중복 감소
- 모듈 인터페이스와 구현 파일이 분리되어 빌드 의존성 관리 용이
- 모듈 인터페이스를 통해 외부 노출 부분과 내부 숨김 부분이 나누어져 캡슐화 강화
- 모듈 간의 의존성을 명확하게 정의 가능하여, 헤더 파일방식 보다 효율적
모듈 선언
참고 : kukuta_모듈
- vs 기준 확장자가
.ixx
인 파일 <- 모듈 인터페이스 단위// ModuleA.ixx 모듈 인터페이스 파일 export module ModuleA; // 내보낼 모듈의 이름 지정 namespace Foo { export int MyIntFunc() // 모듈에서 내보낼 기능(함수)의 인터페이스를 지정 { return 0; } void InternalMyFunc() // 모듈 내부에서만 사용하는 전역 함수 { } export int gobalInt; // 모듈에서 내보내는 전역 변수 export class moduleClass{}; // 모듈에서 내보내는 클래스 }
하위 모듈
모듈의 크기가 커지면, 하위 모듈로 분할하는 것을 권장
하위 모듈은 개별 파일로 구성
// mainmodule.ixx export module mainmodule; export import :submodule1; export import :submodule2; export namespace mainnamespace { void mainFunction() { // 상위 모듈의 함수 구현 } } //================== // submodule1.ixx module mainmodule:submodule1; export namespace mainnamespace::subnamespace1 { void subFunction1() { // 하위 모듈 1의 함수 구현 } } //=================== // submodule2.ixx module mainmodule:submodule2; export namespace mainnamespace::subnamespace2 { void subFunction2() { // 하위 모듈 2의 함수 구현 } } //=================== import mainmodule; int main() { mainnamespace::mainFunction(); mainnamespace::subnamespace1::subFunction1(); mainnamespace::subnamespace2::subFunction2(); return 0; }
번외
- gcc의 경우는, msvc와 확장자명, 전처리문의 위치 문제 등이 있을 수 있음.