정리

언리얼 프로퍼티 시스템의 활용

개발 시 주의 사항

헤더 참조 시 선언 순서

// 아래와 같이 선언할 경우 컴파일 오류
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Student.generated.h"
#include "Person.h"

// generated.h 헤더 파일은 항상 가장 밑에 있어야 함
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.h"
#include "Student.generated.h"

다른 헤더를 참조할 시, generated.h 파일은 항상 가장 밑에 선언되어야 한다.

거기에는 아래와 같은 이유가 있는데,

*1. UHT(Unreal Header Tool)는 generated.h 파일이 포함된 위치 이후의 코드는 분석하지 않음.

  1. generated.h 파일은 UHT가 생성한 리플렉션 데이터를 포함하는데, 여기에 포함된 코드들이 상단에 정의된 클래스, 구조체 메소드 등에 의존할 수 있음.

  2. 다른 헤더 파일과의 충돌로 순환 참조가 일어날 수 있다.*

등 … 언리얼 엔진의 코딩 컨벤션 중 하나이니 명심하자.

cpp 파일 또한 지켜야 할 헤더 참조의 규칙이 있는데,


// 아래와 같이 선언할 경우 컴파일 오류
#include "Teacher.h"
#include "Student.h"
#include "OatGameInstance.h"

// 해당 언리얼 오브젝트에 선언된 헤더가 가장 위에 있어야 함
#include "OatGameInstance.h"
#include "Teacher.h"
#include "Student.h"

cpp에서 헤더를 참조할 때도 주의 해야 할 점이 있는데, 해당 언리얼 오브젝트에 선언된 헤더가 가장 위 쪽에 위치해있어야 한다.

*1. 헤더 파일 간 종속성 관리의 문제

  1. PCH(Precompiled Header) 와의 올바른 연동

  2. 리플렉션 데이터 누락의 위험성*

와 같은 문제가 발생될 수 있다.

이 규칙을 지키지 않으면 UHT에서 첫 번째에 선언되어 있지 않다고 컴파일 오류를 띄운다.

즉 cpp에서는 파일 최상단에 관련 헤더를 포함해야하는데, 그 이유는 컴파일러가 소스코드와 헤더 간의 연결관계를 올바르게 분석할 수 있도록 하기 위함이다.