핵심 요약
- C++17까지는 문제없이 컴파일되던 `u8` UTF-8 문자열 리터럴 코드가 C++20 모드에서는 타입 불일치 에러를 내며 빌드가 깨집니다.
- 기존에는 `const char` 배열로 처리되던 `u8` 리터럴이 C++20에서 새로 추가된 `const char8_t` 배열로 바뀌며 하위 호환성이 깨졌기 때문입니다.
- 구글 C++ 스타일 가이드 등에서는 레거시 코드 파손을 막기 위해 가능한 한 `u8` 접두사 사용을 지양하라고 권고하고 있습니다.
요약 C++의 새로운 표준이 항상 이전 버전과의 하위 호환성을 유지한다는 것은 흔한 착각 중 하나입니다. 언어 표준 위원회가 호환성을 유지하려 노력하는 것은 사실이지만, 항상 완벽하게 지켜지는 것은 아닙니다. 대표적인 사례가 바로 C++20에서 도입된 `u8`과 `char8_t` 관련 변경점입니다.
기존 C++17 이하(C++11, C++14, C++17)에서는 `u8"..."` 형태의 UTF-8 문자열 리터럴을 `const char[N]` 타입으로 처리했습니다. 따라서 `const char*` 인자를 받는 일반 함수에 `u8` 리터럴을 넘겨도 아무런 컴파일 에러 없이 빌드되었습니다.
하지만 C++20 표준에서는 하위 호환성을 깨는 변화가 생겼습니다. `u8` 문자열 리터럴의 타입이 `const char[N]`이 아닌 새로 도입된 `const char8_t[N]` 배열로 변경된 것입니다. 이로 인해 기존 프로젝트를 C++20 모드로 전환하면, 컴파일러가 `const char8_t*`를 `const char*`로 자동 변환할 수 없다는 에러를 뿜어내며 빌드가 실패하게 됩니다.
기존 대규모 라이브러리나 방대한 레거시 코드베이스에서 C++20 업그레이드를 시도할 경우, 잘 돌아가던 코드가 갑자기 깨지는 대참사가 발생할 수 있습니다. 이를 방지하기 위한 대응책으로 구글 C++ 스타일 가이드 등에서는 가능한 한 `u8` 접두사 사용을 피하라고 권장하고 있습니다. C++20에서 의미가 크게 달라진 데다 C++23에서도 추가적인 변경이 예정되어 있기 때문입니다.
Sponsored · 광고