컴파일러 표준 설정: C++17을 사용하는 이유
2강. 컴파일러 표준 설정: C++17을 사용하는 이유
이번 강의에서 해결할 문제
내 컴퓨터에서는 구조적 바인딩과 std::optional이 빌드되는데 팀원의 컴퓨터에서는 문법 오류가 날 수 있습니다. 파일 내용이 같아도 컴파일러 종류·버전·표준 옵션이 다르면 서로 다른 언어 규칙으로 해석되기 때문입니다.
학습 목표
- C++ 언어 버전과 컴파일러 버전의 차이를 설명합니다.
- MSVC, g++, clang++에서 C++17 모드를 지정합니다.
- 코드와 빌드 설정에서 표준 기준을 검증합니다.
먼저 알아야 할 핵심 개념
ISO C++ 표준은 언어 문법과 표준 라이브러리 계약을 정의합니다. 컴파일러는 그 표준을 구현하는 도구이며 최신 컴파일러라고 해서 프로젝트가 자동으로 C++17 모드가 되는 것은 아닙니다. 표준을 고정하면 사용할 수 있는 기능과 빌드 결과의 기준이 명확해집니다.
가장 작은 실행 가능한 예제
#include <iostream>
#if defined(_MSVC_LANG)
constexpr long cppStandard = _MSVC_LANG;
#else
constexpr long cppStandard = __cplusplus;
#endif
static_assert(cppStandard >= 201703L, "C++17 or newer is required");
int main() {
if constexpr (cppStandard >= 201703L) {
std::cout << "C++17 ready\n";
}
}
핵심 코드 줄별 설명
- MSVC는 설정에 따라
_MSVC_LANG에 실제 언어 모드를 기록합니다. - 다른 주요 컴파일러는
__cplusplus매크로로 표준 버전을 제공합니다. 201703L은 C++17 표준을 가리키는 값입니다.static_assert는 조건이 거짓이면 실행 전 컴파일을 중단합니다.if constexpr자체도 C++17 기능이므로 설정 확인에 사용할 수 있습니다.
실행 결과와 값 변화
C++17 ready
MSVC는 /std:c++17, g++와 clang++은 -std=c++17을 사용합니다. 옵션을 C++14로 낮추면 if constexpr 또는 static_assert에서 빌드가 실패해야 정상입니다.
단계별 실습
실습 목표
현재 프로젝트의 C++17 설정을 명령과 코드 두 곳에서 확인합니다.
시작 전 상태와 실행 방법
터미널에서 예제 파일이 있는 폴더를 열고 사용 중인 컴파일러를 확인합니다.
1단계: 최소 코드 작성
MSVC cl /EHsc /std:c++17 check_cpp17.cpp 또는 g++ g++ -std=c++17 check_cpp17.cpp로 빌드합니다.
2단계: 값 또는 조건을 바꿔 결과 비교
요구 버전을 202002L로 바꾸어 C++17 모드가 C++20 요구를 통과하지 못하는지 확인합니다.
3단계: 작은 기능 확장
CMake를 사용한다면 대상에 target_compile_features(app PRIVATE cxx_std_17)을 추가합니다.
4단계: 스스로 해결하기
Release와 Debug 구성 모두 같은 표준 옵션을 사용하는지 IDE의 빌드 로그에서 확인하세요.
막혔을 때
MSVC에서 __cplusplus 값이 오래된 값으로 보이면 _MSVC_LANG을 확인하거나 /Zc:__cplusplus 옵션을 추가합니다. 표준 라이브러리 기능이 없다는 오류는 컴파일러 버전 자체가 너무 오래되었을 가능성도 있습니다.
흔한 실수와 해결 방법
- IDE 화면만 설정: CI와 명령줄 빌드 파일에도 같은 표준을 기록합니다.
- 최신 옵션을 무조건 사용: 의존 라이브러리와 배포 환경이 지원하는 기준을 합의합니다.
- 표준과 컴파일러를 같은 것으로 생각: C++17 지원 범위는 컴파일러 버전마다 다를 수 있습니다.
게임 개발 연결
게임 엔진 프로젝트는 엔진 버전과 빌드 도구가 지원하는 C++ 표준을 따릅니다. 일반 콘솔 예제의 옵션을 그대로 엔진 빌드에 추가하기보다 Unreal Build Tool이나 Unity 네이티브 플러그인의 공식 설정을 기준으로 확인합니다.
이해 점검 질문 3개
- 같은 소스가 다른 컴퓨터에서 실패할 수 있는 이유는 무엇인가요?
static_assert가 런타임assert와 다른 점은 무엇인가요?- C++17 옵션과 최신 컴파일러 설치가 각각 해결하는 문제는 무엇인가요?
핵심 요약
언어 표준은 프로젝트 계약입니다. 개발 환경·빌드 스크립트·CI에서 C++17을 명시하고 작은 검증 코드로 실제 적용 여부를 확인합니다.
다음 강의 연결
3강. auto와 타입 추론에서 C++17 컴파일러가 초기값으로 타입을 결정하는 규칙과 명시적 타입이 더 나은 경우를 구분합니다.
컴파일러 표준 설정: C++17을 사용하는 이유 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.