본문으로 건너뛰기
모던 C++LESSON 02

컴파일러 표준 설정: C++17을 사용하는 이유

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

2강. 컴파일러 표준 설정: C++17을 사용하는 이유

이번 강의에서 해결할 문제​

내 컴퓨터에서는 구조적 바인딩과 std::optional이 빌드되는데 팀원의 컴퓨터에서는 문법 오류가 날 수 있습니다. 파일 내용이 같아도 컴파일러 종류·버전·표준 옵션이 다르면 서로 다른 언어 규칙으로 해석되기 때문입니다.

학습 목표​

  • C++ 언어 버전과 컴파일러 버전의 차이를 설명합니다.
  • MSVC, g++, clang++에서 C++17 모드를 지정합니다.
  • 코드와 빌드 설정에서 표준 기준을 검증합니다.

먼저 알아야 할 핵심 개념​

ISO C++ 표준은 언어 문법과 표준 라이브러리 계약을 정의합니다. 컴파일러는 그 표준을 구현하는 도구이며 최신 컴파일러라고 해서 프로젝트가 자동으로 C++17 모드가 되는 것은 아닙니다. 표준을 고정하면 사용할 수 있는 기능과 빌드 결과의 기준이 명확해집니다.

가장 작은 실행 가능한 예제​

check_cpp17.cpp
#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";
}
}

핵심 코드 줄별 설명​

  1. MSVC는 설정에 따라 _MSVC_LANG에 실제 언어 모드를 기록합니다.
  2. 다른 주요 컴파일러는 __cplusplus 매크로로 표준 버전을 제공합니다.
  3. 201703L은 C++17 표준을 가리키는 값입니다.
  4. static_assert는 조건이 거짓이면 실행 전 컴파일을 중단합니다.
  5. 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개​

  1. 같은 소스가 다른 컴퓨터에서 실패할 수 있는 이유는 무엇인가요?
  2. static_assert가 런타임 assert와 다른 점은 무엇인가요?
  3. C++17 옵션과 최신 컴파일러 설치가 각각 해결하는 문제는 무엇인가요?

핵심 요약​

언어 표준은 프로젝트 계약입니다. 개발 환경·빌드 스크립트·CI에서 C++17을 명시하고 작은 검증 코드로 실제 적용 여부를 확인합니다.

다음 강의 연결​

3강. auto와 타입 추론에서 C++17 컴파일러가 초기값으로 타입을 결정하는 규칙과 명시적 타입이 더 나은 경우를 구분합니다.

MINI QUIZ

컴파일러 표준 설정: C++17을 사용하는 이유 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“컴파일러 표준 설정: C++17을 사용하는 이유” 실행 결과를 설명하는 내용으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2‘IDE 화면만 설정’ 상태에 관한 “컴파일러 표준 설정: C++17을 사용하는 이유” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

2강. 컴파일러 표준 설정: C++17을 사용하는 이유 미완료 상태