g++ 11에서 C++20 헤더 단위 사용하기
g++ 11도 C++20 헤더 단위 기능을 지원합니다.
이전 글 Visual Studio 2019에서 C++20 헤더 단위 사용하기의 GCC 버전입니다. 헤더 단위(header unit)에 관한 설명은 이전 글에 있으니 생략합니다.
예제 역시 이전 글과 동일하지만, 편의를 위해 다시 제시합니다. 목표는 다음과 같은 C++ 프로그램을 g++ 11로 성공적으로 빌드해서 실행하는 것입니다.
main.cpp
#include <iostream>
import <vector>; // (1)
import "myheader.h"; // (2)
int main() {
std::vector vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::cout << "get_size(vec): " << get_size(vec) << "\n";
}
myheader.h
#pragma once
auto get_size(auto obj) { return obj.size(); }
g++ 11 버전 현재, 헤더 단위를 사용하려면 메인 프로그램을 컴파일하기 전에 먼저 import
되는 헤더들을 일일이 컴파일해 주어야 합니다. 이번 예제는 사용자 정의 헤더 하나와 표준 헤더 하나를 사용합니다. 우선, 사용자 정의 헤더를 헤더 단위를 위해 컴파일하려면 모듈 기능을 위한 -fmodules-ts
와 옵션과 링크 없이 컴파일만 하기 위한(메인 프로그램이 아니므로) -c 옵션, 그리고 C++20 기능을 위한 -std=c++20
옵션[1]이 필요합니다.
$ g++ -std=c++20 -fmodules-ts -c myheader.h
표준 헤더를 컴파일하려면 앞의 옵션에 -x c++-system-header
옵션을 추가해야 합니다.
$ g++ -std=c++20 -fmodules-ts -c -x c++-system-header vector
이제 소스 코드를 컴파일하는 데 필요한 재료가 모두 준비되었습니다.[2] 이제 -c
없이 소스 코드를 컴파일하면 됩니다. 필요합니다.
$ g++ -std=c++20 -fmodules-ts main.cpp -o main
이렇게 하면 main
(또는 main.exe
)이라는 실행 파일이 만들어집니다.
참고로, 이 표준 헤더의 헤더 단위는 표준 라이브러리 모듈이 아닙니다. 표준 라이브러리 모듈은 C++23 또는 그 이후에 추가될 예정인데요. 관련 제안서 P0581r0에 따르면 표준 라이브러리 모듈은 import <헤더>;
가 아니라 import std.???;
형태로 사용하는데, 표준 헤더마다 std.헤더
가 있는 것이 아니라 이를테면 <new>
, <exception>
등을 std.fundamental
로 묶고, <iostream>
, <locale>
등을 std.io
로 묶는 등 기능별, 성격별로 좀 더 큰 모듈을 두는 방식입니다.