ReSharper C++ 2020.1: C++20 신규 기능, 향상된 코딩 지원, HLSL 지원 등

Jessie Cho

기쁜 마음으로 올해 첫 주요 릴리스 소식을 전해드립니다! EAP가 시작된 이후 저희 팀은 블로그 게시물 연재를 통해 개선 사항 및 신규 기능을 지속적으로 안내해 드렸습니다. 이제 지난 업데이트에 대한 요약과 이번 릴리스의 주요 내용을 살펴볼 차례입니다!
ReSharper C++ 2020.1

ReSharper C++ 2020.1 버전에는 최신 C++20 업데이트 사항이 반영되어 있으며, 향상된 코딩 지원 및 탐색 기능을 선보입니다. 또한 Unreal Engine 4 및 HLSL 지원으로 생산성을 더욱 높였습니다. 아래 글을 통해 이와 관련된 자세한 내용 및 2020.1 버전의 기타 변경 내용을 확인해 보세요.

새 버전으로 업데이트하거나 30일 무료 평가판을 사용해 보세요. 최신 빌드는 웹사이트 및 Toolbox App에서 제공됩니다.

RESHARPER C++ 2020.1 다운로드

C++20 지원

프라하에서 열린 2월 회의에서 ISO C++ 위원회는 C++20의 기술적 작업을 마무리하여 C++20 Committee Draft(위원회 초안)을 완성했습니다. 따라서 ReSharper C++ 2020.1 버전은 최신 언어 표준에 따른 새로운 기능을 지원합니다.

지정된 열거자를 로컬 범위로 가져올 수 있도록 지원하고자 C++20은 using 선언을 개선했습니다(P1099 참조). 새로운 using enum 구문을 사용하면 대상 열거형에서 모든 열거자를 추가하고 이름 중복을 삭제할 수 있습니다. ReSharper C++ 2020.1에는 using enum 선언 및 신규 리팩토링 Introduce Using Enum(Using Enum 삽입) 지원이 추가되어 기존 코드에 using enum 선언을 손쉽게 추가할 수 있습니다.
Using Enum 삽입

C++20 Concepts에는 제한된 유형의 플레이스홀더 및 축약형 함수 템플릿에 대한 지원이 추가되었습니다(P1141 참조) 이제 컨셉으로 auto 유형을 제한하고 매개변수 목록의 auto 또는 concept auto 플레이스홀더를 활용해 템플릿 함수를 선언할 수 있습니다. 또한, 충족되지 않은 제약 조건에 대한 오류 메시지가 개선되어 템플릿 치환 과정의 오류를 보다 잘 이해할 수 있습니다.
충족되지 않은 제약 조건

마지막으로 ReSharper C++는 람다용 C++20 템플릿 구문을 사용하는 새로운 빠른 수정 기능(P0428 참조)을 더해 더욱 간결한 코드 작성을 지원합니다. 예를 들어, 람다 매개변수에서 decltype을 사용하지 않고도 람다 정방향 구문에 적합한 유사 구문을 사용할 수 있습니다.
완벽한 람다 정방향 구문

앞으로도 C++20 지원을 지속적으로 개선할 예정입니다. 현재 constexpr 함수 평가를 개선 중에 있으며 3방향 비교 “우주선” 연산자에 대한 지원도 추가하고 있습니다. 많은 관심 부탁드립니다!

Unreal Engine 4

ReSharper C++ 2020.1 버전에서는 Unreal Engine 코딩 표준에 대한 적합성이 개선되었습니다. 이에 따라 콘솔 변수 및 로그 카테고리를 처리하는 이름 지정 규칙이 업데이트되었으며, UE4 프로젝트에서 Use auto(자동 사용) 검사가 기본적으로 숨김 표시됩니다.

클래스 또는 파일 이름 변경 시에는 Rename(이름 변경) 리팩토링으로 *.generated.h include 지시문 및 A, F, E, T, S, U 접두어를 사용하는 관련 파일을 업데이트할 수 있습니다.

이제 Unreal Engine USF 파일이 가상 파일 경로와 함께 지원됩니다.
가상 파일 경로

사소하지만 유용한 탐색 기능 개선: 이제 Search Everywhere/Go to에서 Unreal Engine 스타일의 열거형을 포함하는 네임스페이스를 탐색할 수 있습니다.

또한 ReSharper C++ 2020.1 버전에는 Unreal Engine 4 포크인 SpatialOS GDK에 대한 지원이 추가되어 클라우드 환경에서 온라인 게임의 실행 및 관리가 가능합니다.
SpatialOS GDK

마지막으로 ReSharper C++ 2020.1 버전은 다음 Unreal Engine 4.25 릴리스와 호환성을 고려하여 제작되었습니다. 이전 버전의 ReSharper C++로 UE 4.25 프로젝트 작업 시에는 “Read project properties asynchronously(프로젝트 속성을 비동기식으로 읽기)” 설정을 잊지 말고 선택 해제하세요. 이 설정은 ReSharper | Options(옵션) | Code Editing(코드 편집) | C++ | Performance(성능)에서 확인하실 수 있습니다.

HLSL 지원

ReSharper C++ 2020.1 버전에서 게임 개발과 관련된 기능을 한 가지 더 선보입니다. 바로 High Level Shading Language(고급 셰이딩 언어, HLSL) 조기 지원입니다. HLSL 지원에 대한 짤막한 데모를 확인해 보세요.

ReSharper C++는 기본 색 구성표에 따라 HLSL 코드를 강조 표시하며 유형 정보, 문서가 포함된 코드 요소에 대한 툴팁 및 삽입된 힌트를 표시합니다.
HLSL: 주요 기능

그뿐 아니라 전체 솔루션, 참조된 파일 및 표준 라이브러리에서 구조체, 함수 또는 매개변수를 검색하고 빠르게 탐색할 수도 있습니다.

또한 완벽한 HLSL 경험을 위해 ReSharper C++는 코드 완성 목록의 스마트 제안, 입력된 매개변수와 호환 가능한 시그니처 강조 표시, 일치하는 구분자 자동 삽입 기능 등을 지원합니다.
HLSL: 코드 완성

HLSL 지원은 아직 개발 초기 단계에 있으므로 몇 가지 제한 사항이 존재합니다. 다음 릴리스에서는 기본 내장 함수의 코드 완성 기능을 개선하고 상수와 텍스처 버퍼에 대한 더욱 향상된 검색 및 탐색 기능을 선보일 예정입니다.

코드 분석 및 빠른 수정

static_cast를 사용할 경우 새 검사에서 더 많은 사례를 탐지하고 적절한 빠른 수정을 제안하여 코드를 업데이트할 수 있습니다.

  • void*에 형 변환 시 static_cast대신 reinterpret_cast 사용.
  • C++ 형 변환 대신 함수 스타일 형 변환 사용.
    C++ 형 변환 대신 함수 스타일 형 변환 사용

그뿐 아니라 람다식을 위한 빠른 수정을 제안하는 검사 두 개도 새롭게 추가되었습니다.

  • 사용하지 않는 람다 캡처 – 로컬 변수가 람다로 캡처되었지만 람다 본문에서 사용되지 않는 경우 ReSharper C++가 사용하지 않는 람다를 알려주고 해당 람다 제거를 제안합니다.
  • 명시적 템플릿 매개변수를 사용하도록 람다를 다시 작성할 수 있습니다. ReSharper C++는 코드 가독성 개선을 위해 새로운 С++20 람다 템플릿 구문을 사용하도록 제안합니다.
    명시적 템플릿 매개변수 활용을 위해 람다가 다시 작성된 경우

C++17 maybe_unused 속성을 적용하는 데 유용한 두 가지 기능:

  • UNREFERENCED_PARAMETERQ_UNUSED 어노테이션을 [[maybe_unused]] 속성으로 교체하는 컨텍스트 액션.
  • 사용되지 않은 매개변수 또는 변수에 [[maybe_unused]] 속성을 추가하는 빠른 수정.
    [[maybe_unused]]

기본 제공되는 Clang-Tidy 바이너리도 Clang 10으로 업그레이드하여 70개의 신규 검사 및 컴파일러 진단을 지원합니다.

코딩 지원

이제 .NET용 ReSharper에 포함된 두 가지 인기 기능인 Rearrange Code(코드 재정렬) 및 Complete Statement(구문 완성)을 ReSharper C++에서도 사용할 수 있습니다.

코드 재정렬 기능은 코드 요소의 빠른 이동 및 현재 범위의 확장 혹은 축소 등을 지원합니다. 이 기능을 사용하려면 코드 요소를 선택하고 Ctrl+Shift+Alt를 누르거나 이동하고 싶은 부분을 선택 후 방향키를 누르면 됩니다.

  • Move up(위로 이동) 및 Move down(아래로 이동) 명령어를 사용하면 특정 범위의 요소를 해당 범위의 기타 요소에 따라 혹은 인접한 범위에서 위아래로 다시 정렬할 수 있습니다.
    코드 재정렬: 아래로 이동
  • Move left(왼쪽으로 이동) 및 Move right(오른쪽으로 이동) 명령어를 사용하면 일반적으로 한 줄에 적힌 코드 요소를 재정렬하거나, 구문이나 선언을 다음 영역 혹은 현재 영역 외부로 이동할 수 있습니다.
    코드 재정렬: 왼쪽으로 이동

구문 완성 기능은 필수 구문 요소를 삽입하여 현재 구문을 완성하고 캐럿을 적절한 자리에 배치합니다. Ctrl+Shift+Enter 단축키를 사용하면 여러 개의 작은 액션을 수행하지 않고도 구문 완성이 지원됩니다.
구문 완성

Visual Studio 단축키 Ctrl+/로 신규 Document(문서) 에디터 액션을 활용하면 컨텍스트 액션을 사용하는 대신 근처 코드 요소에 문서 주석을 빠르게 생성할 수 있습니다.
“문서” 에디터 액션

이제 코드 완성 목록에 라벨 이름, 표준 C++ 속성, goto 구문 라벨 이름, 새 std::forward 접미어 템플릿, 기본 함수 호출 인수가 제안으로 표시됩니다. 또한, 매크로 정의에서도 코드 완성 기능이 작동합니다.
코드 완성 목록에서 표준 C++ 속성 제안

ReSharper C++ 개발 환경에서 매개변수 및 유형 이름 힌트는 기본적으로 제공됩니다(사용 가능한 모든 힌트는 다음 게시물에서 확인하세요). 이제 종속 코드에서도 힌트를 사용할 수 있습니다.
종속 코드 힌트

또한 개선된 입력 지원을 통해 모든 코드 조각을 선택하고 선택된 코드를 감싸기 위한 대괄호, 중괄호, 소괄호 또는 따옴표를 그에 대응하는 문자로 입력할 수 있습니다.

코드 스타일 및 서식 지정

여러 개선 사항과 더불어 ReSharper C++ 2020.1의 서식 지정 엔진도 C++20 Concept 구문을 완전히 지원합니다. 또한 클래스 멤버의 이중 들여쓰기 옵션, 람다 매개변수에서 괄호 앞의 띄어쓰기 제어 옵션 등 다양한 서식 지정 옵션이 새롭게 추가되었습니다.

In ReSharper C++ 2019.3 버전에서 #include 지시문 정렬 기능을 도입했습니다. 이번 릴리스에서는 .clang-format 파일의 정렬 설정을 불러오는 기능을 추가하였습니다. ReSharper | Options(옵션) | Code Editing(코드 편집) | General Formatter Style(일반 서식 지정 도구 스타일) 설정 페이지에서 Read code style from .clang-format style(.clang-format 스타일에서 코드 스타일 읽기) 옵션을 선택하세요. ReSharper C++가 .clang-format 파일의 IncludeBlocks, IncludeCategories, IncludeIsMainRegexSortIncludes 설정을 사용해 clang-format과 동일한 방식으로 #include 지시문을 정렬합니다.

또한 ReSharper C++ 2020.1에는 두 가지 추가적인 설정이 도입되어 #includes 정렬 동작을 더욱 원활하게 구성할 수 있습니다.

  • Case-sensitive sort – 대문자로 시작하는 모든 include 지시문을 소문자로 시작하는 지시문보다 먼저 배치하는 데 사용됩니다.
  • 디렉토리별 그룹 헤더 – 파일 경로에 따라 헤더 그룹을 생성하는 데 사용됩니다.
    include 지시문 정렬

열거형 리팩토링

C++11 및 C++20 표준에서 변경된 언어에 따라 enum 사용을 업데이트하는 두 가지 신규 리팩토링을 추가하였습니다.

Convert to Scoped Enum(범위가 지정된 열거형으로 변환) 리팩토링을 활용하면 C 스타일 열거형 선언이 범위가 지정된 C++11 열거형으로 변환됩니다.
Convert to Scoped Enum
이 리팩토링은 모든 열거형 선언을 업데이트하며 열거자 참조를 한정합니다. 또한, 열거형 유형 값이 통합 유형의 명시적 형 변환일 경우 ReSharper C++에서 그 내용을 경고하고 해당 유형에 자동으로 static_cast를 삽입합니다.

Introduce Using Enum(Using Enum 삽입) 리팩토링을 통해 열거형 선언을 사용하는 C++20을 현재 범위에 추가하고 열거자 참조의 길이를 줄일 수 있습니다.
Using Enum 삽입 리팩토링

ReSharper C++ 2020.1 버전은 주석에 있는 일치하는 단어에서 심볼 선언으로 이동하는 기능을 지원합니다. Ctrl 키를 누른 상태로 혹은 마우스 스크롤 버튼으로 이름을 클릭하세요. 스크롤 버튼 탐색 역시 새로운 기능입니다.
주석의 선언으로 이동 명령어

Search Everywhere/Go to(전체 검색/이동)에 concepts과 네임스페이스라는 두 가지 필터 카테고리가 새롭게 포함되었습니다. 검색창에 “/”를 입력하여 이용 가능한 모든 필터를 확인해 보세요.
전체 검색/이동 필터

이제 File Structure(파일 구조) 창에서 다음 아이콘 표시기로 빠른 파일 탐색의 세부 내용을 확인할 수 있습니다.

  • 클래스 멤버 접근성
  • virtual, static, pure 지정자
  • 함수가 기본 함수를 재정의, 구현하거나 숨길 경우 클래스 멤버 상속 정보
    파일 구조 아이콘

유닛 테스트

mock 메소드 생성기가 GTest 1.10에 도입된 MOCK_METHOD 매크로를 지원합니다. 기존 GTest 릴리스에서 사용되었던 MOCK_(const_)METHODn() 매크로 기능은 삭제되었습니다.
GTest 1.10에 도입된 MOCK_METHOD 매크로

ReSharper C++ 테스트 러너는 버퍼가 없는 출력 결과를 읽는 하위 테스트 프로세스와 통신하기 위해 이름이 지정된 파이프를 사용합니다. 하지만 일부 환경에서는 보안 소프트웨어로 인해 이름이 지정된 파이프가 오작동할 수도 있습니다. Use named pipes to communicate with child processes(하위 프로세스와 통신에 이름 지정된 파이프 사용) 설정이 새롭게 추가되어 해당 옵션을 선택 해제하고 임시 파일을 대신 사용하는 것이 가능합니다.
하위 프로세스와 통신에 사용되는 이름 지정 파이프

이번 릴리스의 신규 기능 및 버그 수정 전체 목록에는 230가지 이상의 이슈가 포함되어 있으며, 해당 목록은 이슈 트래커에서 제공됩니다. 언제든 새 기능을 요청하거나 기존 요청에 좋아요를 눌러주세요. 우리는 여러분의 피드백을 언제나 환영합니다!

또한 ReSharper 플랫폼에 더 많은 변경 사항이 추가될 예정이오니 새로운 기능 페이지도 확인해주세요.

ReSharper C++ 2020.1를 다운로드하고 여러분의 의견을 들려주세요!

RESHARPER C++ 2020.1 다운로드

ReSharper C++ 팀
JetBrains
The Drive to Develop

ReSharper C++ 2020.1: C++20 신규 기능, 향상된 코딩 지원, HLSL 지원 등 게시물은 ReSharper C++ 블로그에 가장 먼저 표시됩니다.

이 게시물은 Elvira Mustafina가 작성한 ReSharper C++ 2020.1: New C++20 Features, Improved Coding Assistance, HLSL Support, and More를 번역한 글입니다.