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
이동 시맨틱
- 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 디자인 가이드라인
- 너무 긴 함수 파라미터는 전용 구조체를 선언해서 전달한다.
정리
- public에서 private로 이어지는 클래스 체계
- 명명 규칙
- 파스칼 케이싱
- 공백, 언더스코어 없음
- 고유한 접두사
- 코드의 명확성
- 파라미터에 In, Out 접두사 사용
- const 지시자 적극 활용
- 레퍼런스를 통한 복사 방지
- auto 키워드 자제
- Find In Files
- #include 구문은 의존성을 최소화시켜 주의 깊게 다룰 것