언리얼 C++ 코딩규칙

myeongrangcoding·2023년 11월 24일

https://docs.unrealengine.com/5.3/ko/epic-cplusplus-coding-standard-for-unreal-engine/

언리얼 C++ 코딩규칙

  • 코딩 표준을 정하고 프로젝트의 모든 코드가 한 사람이 만든 것 처럼 통일된 방식으로 코딩을 작성해야 한다.
  • 언리얼 엔진은 자체적으로 코딩 표준을 정했기 때문에 기존 C++ 코딩 방법을 버리고 언리얼 엔진 코딩 표준을 따라야 한다.

파스칼 케이싱

  • 합성어의 첫 글자를 대문자를 사용해 명명.
  • 언리얼 엔진은 파스칼 케이싱만을 사용한다.

타입 이름

  • 접두사를 포함하여 구분한다.
    예: 템플릿 클래스에는 접두사 T를 포함한다.
  • Actor 클래스는 언리얼 오브젝트로부터 상속을 받았지만 A로 시작하는 클래스 규칙을 따른다.
    예: AActor

int8/int32/TCHAR

  • int형이 가지고 있는 정확한 용량 크기를 지정해야 한다.
  • 캐릭터 문자에 대해서는 TCHAR을 사용한다.

nullptr

  • nullptr은 모든 경우 C 스타일 NULL 매크로 대신 사용해야 한다.

auto 키워드

  • 몇 가지 예외를 제외하면 auto를 사용해서는 안 된다. 즉, 읽는 사람에게 타입이 명확하게 보여야 한다.
    사용 경우: 람다 사용, 이터레이터 타입이 매우 장황하여 가독성에 악영향을 미치는 경우

Enum

  • Enum 클래스를 권장한다.

이동 시맨틱

  • std::move의 UE 해당 버전인 MoveTemp를 써서 구현하면 된다.

파일 이름

  • 파일 이름에는 가급적 접두사를 붙이지 않는다.

헤더

  • 헤더 include 대신 전방 선언(forward declaration)이 가능한 경우 그렇게 한다.

일반적인 스타일 문제

if ((Blah->BlahP->WindowExists->Etc && Stuff) &&
    !(bPlayerExists && bGameStarted && bPlayerStillHasPawn &&
    IsTuesday())))
{
    DoSomething();
}

이러한 코드는 다음으로 대체해야 함

const bool bIsLegalWindow = Blah->BlahP->WindowExists->Etc && Stuff;
const bool bIsPlayerDead = bPlayerExists && bGameStarted && bPlayerStillHasPawn && IsTuesday();
if (bIsLegalWindow && !bIsPlayerDead)
{
    DoSomething();
}
  • 포인터와 레퍼런스의 스페이스는 그 오른쪽에 딱 한 칸만 두어야 한다. 그래야 Find in Files를 사용할 수 있다.
FShader Type* Ptr;	// 가능.
FShader Type *Ptr;	// 불가능.
FShader Type * Ptr; // 불가능.

API 디자인 가이드라인

  • 너무 긴 함수 파라미터는 전용 구조체를 선언해서 전달한다.

정리

  1. public에서 private로 이어지는 클래스 체계
  2. 명명 규칙
    • 파스칼 케이싱
    • 공백, 언더스코어 없음
    • 고유한 접두사
  3. 코드의 명확성
    • 파라미터에 In, Out 접두사 사용
    • const 지시자 적극 활용
    • 레퍼런스를 통한 복사 방지
    • auto 키워드 자제
  4. Find In Files
  5. #include 구문은 의존성을 최소화시켜 주의 깊게 다룰 것
profile
명랑코딩!

0개의 댓글