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): 튜플, 구조체 등 복합 객체를 개별 변수로 분해할 수 있음
-
cppauto [x, y] = std::make_pair(1, 2);
- constexpr if: 템플릿 코드에서 컴파일 타임 조건 분기 가능
-
cppif constexpr (조건) { /* ... */ }
- Fold Expressions: 가변 인자 템플릿을 간결하게 연산할 수 있는 문법 도입
-
cpptemplate<typename... Args> auto sum(Args... args) { return (args + ...); }
- 파일 시스템 라이브러리(std::filesystem): 파일 및 디렉토리 작업을 표준화된 방식으로 지원
- 병렬/동시 STL 알고리즘: 표준 라이브러리 알고리즘에 병렬 실행 정책 지원
- if/switch 초기화자: if, switch문에서 변수 선언 및 초기화 가능
-
cppif (int x = func(); x > 0) { /* ... */ }
- 중첩 네임스페이스: 여러 네임스페이스를 한 줄로 선언 가능
-
cppnamespace a::b::c { /* ... */ }
- std::optional: 값이 있을 수도 없을 수도 있는 상황을 명확하게 표현
- 클래스 템플릿 인자 추론(CTAD): 객체 생성 시 템플릿 인자를 명시하지 않아도 자동 추론
-
cppstd::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++ 코드를 작성하고자 한다면 적극적으로 권장됩니다