Develop/C&CPP

[cpp] cpp17에서 달라진 점

크레이지J 2025. 4. 20. 10:10
반응형

C++17에서 달라진 점 (C++14와 비교)

C++17은 C++14에 비해 여러 가지 새로운 기능과 개선점을 도입하여, 개발자 생산성, 코드 가독성, 그리고 언어의 표현력을 크게 향상시켰습니다. 아래 표와 목록에서 주요 변경 사항을 정리합니다.

주요 변경점 비교

C++17
기능 c++14 c++17
Inline 변수 미지원 지원 (헤더 파일에서 변수 정의/초기화 가능)
구조적 바인딩 (Structured Bindings) 미지원 지원 (튜플, 구조체 분해 가능)
constexpr if 미지원 지원 (컴파일 타임 조건 분기)
Fold Expressions 미지원 지원 (가변 인자 템플릿 연산 간결화)
파일 시스템 라이브러리 미지원 지원 (std::filesystem)
병렬/동시 STL 알고리즘 미지원 지원 (병렬 실행 정책)
if/switch 초기화자 미지원 지원 (if/switch문에서 변수 선언 및 초기화)
중첩 네임스페이스 미지원 지원 (namespace a::b::c와 같이 간결하게 표현)
옵셔널 타입 미지원 지원 (std::optional)
클래스 템플릿 인자 추론(CTAD) 미지원 지원 (템플릿 인자 자동 추론)
인라인 변수 미지원 지원 (ODR 위반 없이 헤더에 변수 정의 가능)
 

C++17에서 추가된 주요 기능 및 개선 사항

  • Inline 변수: 헤더 파일에서 변수 정의/초기화 가능, ODR(One Definition Rule) 위반 방지
  • 구조적 바인딩 (Structured Bindings): 튜플, 구조체 등 복합 객체를 개별 변수로 분해할 수 있음
  •  
    cpp
    auto [x, y] = std::make_pair(1, 2);
  • constexpr if: 템플릿 코드에서 컴파일 타임 조건 분기 가능
  •  
    cpp
    if constexpr (조건) { /* ... */ }
  • Fold Expressions: 가변 인자 템플릿을 간결하게 연산할 수 있는 문법 도입
  •  
    cpp
    template<typename... Args> auto sum(Args... args) { return (args + ...); }
  • 파일 시스템 라이브러리(std::filesystem): 파일 및 디렉토리 작업을 표준화된 방식으로 지원
  • 병렬/동시 STL 알고리즘: 표준 라이브러리 알고리즘에 병렬 실행 정책 지원
  • if/switch 초기화자: if, switch문에서 변수 선언 및 초기화 가능
  •  
    cpp
    if (int x = func(); x > 0) { /* ... */ }
  • 중첩 네임스페이스: 여러 네임스페이스를 한 줄로 선언 가능
  •  
    cpp
    namespace a::b::c { /* ... */ }
  • std::optional: 값이 있을 수도 없을 수도 있는 상황을 명확하게 표현
  • 클래스 템플릿 인자 추론(CTAD): 객체 생성 시 템플릿 인자를 명시하지 않아도 자동 추론
  •  
    cpp
    std::pair p(1, 2); // std::pair<int, int>로 추론
  • 기타: std::variant, std::any, std::string_view 등 유틸리티 타입 추가, lambdas 개선, 기타 표준 라이브러리 확장

요약

  • C++14는 C++11의 기능을 다듬고 소폭 확장한 "마이너 업그레이드"였다면,
    C++17은 새로운 문법, 표준 라이브러리 확장, 컴파일 타임 프로그래밍 강화 등
    실질적인 "메이저 업그레이드"에 가까운 변화가 많습니다
  • 대부분의 기능은 기존 코드와의 호환성을 유지하면서,
    새로운 코드 작성 시 코드의 간결성, 안전성, 효율성을 크게 높여줍니다.

C++17로의 전환은 최신 컴파일러(GCC, Clang, MSVC 등)에서 모두 지원되며,
현대적인 C++ 코드를 작성하고자 한다면 적극적으로 권장됩니다