C++ 20 의 모듈 시스템이란 헤더 파일을 따로 만들지 않고도 cpp 파일들만 가지고 클래스들의 메타데이터 정보를 생성해 h 파일 없이도 링킹 가능하도록 만든 것입니다.
기존에는 대형 프로젝트의 경우 헤더 파일에서 한글자만 바꾸더라도 매크로 레벨의 헤더 파일 복붙 방식 O(n*n) 이라서 하위 cpp 파일까지 전부 컴파일을 다시 했어야 했는데, 이 기능 덕분에 컴파일 속도도 매우 빨라집니다.
현대적인 언어 JAVA, C# 등은 전부 이런 방식을 이미 쓰고 있는데 C 가 워낙 오래된 언어라서 그렇습니다..
모듈 시스템은 2017년 표준에 들어온 기능임에도, 아직 TR (Test & Review) state 로 있어서 일부 컴파일러에서 기능을 활성화야 사용할 수 있습니다.
이 글에서는 Visual Studio 2022 에서 사용하는 방법을 알려드립니다.
(인텔리센스는 현재 버전에서 지원하지 않습니다)
1. 일반적인 빈 C++ 프로젝트를 만들어줍니다.
2. 프로젝트 설정을 다음과 같이 합니다.
![](https://blog.kakaocdn.net/dn/dCHCut/btsGEsU4yNE/MEHd2Y7Q3K52Sl8m7an9dk/img.png)
![](https://blog.kakaocdn.net/dn/CVJYU/btsGEheQ8fy/kXuvpcHC9okuB7HCdAor81/img.png)
![](https://blog.kakaocdn.net/dn/KMzQE/btsGEsOflct/4Lo0MCyfZ474uUNv6ONTZ0/img.png)
3. 모듈 (기존에는 .h, .cpp 파일이 따로 있는 클래스에 해당) 파일을 Math.ixx 로 만들어줍니다.
![](https://blog.kakaocdn.net/dn/QeSPB/btsGBZmbWjx/KlKwpKCVAsJ2xkoQlXDH6k/img.png)
Math.ixx 파일
#pragma once
export module Math; // 외부로 Math 라이브러리를 링킹 해주세요 라는 의미입니다.
export int Add(int a, int b)
{
return a + b;
}
export int Sub(int a, int b)
{
return a - b;
}
export int Mul(int a, int b)
{
return a * b;
}
export int Div(int a, int b)
{
return a / b;
}
4. main 이 들어있는 cpp 파일을 작성합니다.
Main.cpp 파일
#pragma once
import <iostream>; // 표준 라이브러리들도 <> 괄호로 감싸서 include 가능합니다.
import Math; // Math 라이브러리를 include 하는 것과 같습니다.
int main()
{
std::cout << "test " << Add(1, 2) << std::endl;
return 0;
}
4.1 C++23 부터는 표준 라이브러리들을 모듈 방식으로 사용할 수 있습니다. (내용 추가)
다만 프로젝트 설정을 아래와 같이 해야 합니다.
![](https://blog.kakaocdn.net/dn/NbKUE/btsGC39ek0Q/w2dHVFTkLxkZwG9FWCIzJK/img.png)
![](https://blog.kakaocdn.net/dn/bG9gLG/btsGBX21b3i/3kRk1b3i0KEKGzEAcjp23K/img.png)
5. 컴파일 하면 끝
C++20 스타일
빨간 밑줄은 인텔리센스가 아직 모듈을 지원하지 않아서 그렇습니다. 무시하셔도 좋습니다.
C++23 스타일
'C++' 카테고리의 다른 글
[C++ Core Guidelines] P.8 자원이 새지 않도록 하자 (0) | 2024.04.17 |
---|---|
[C++ 23] std::print, std::println 사용하기 (0) | 2024.04.15 |
[C++ Core Guidelines] P.7 런타임 에러는 빨리 잡자 (0) | 2024.04.13 |
[C++ Core Guidelines] P.6 컴파일 타임에 평가가 불가능한 코드는 런타임에서라도 평가되도록 하자 (0) | 2024.04.11 |
[C++ Core Guidelines] P.5 가급적 컴파일 타임에 코드가 평가될 수 있도록 만들자 (0) | 2024.04.11 |