C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

UE4/C++ FORCEINLINE にしたいけど Debug ビルドの時は inline 最適化されたくない関数を定義する方法、あるいは UE_BUILD_xxxx シリーズのマクロについて。

UE4/C++ FORCEINLINE にしたいけど Debug ビルドの時は inline 最適化されたくない関数を定義する方法

#ifndef UE_BUILD_DEBUG
  FORCEINLINE
#endif
  void hogehoge()
  { /* fugafuga */ }

と、いうわけで #ifdef でOK。 Debug ビルドで定義される UE_BUILD_DEBUG の他に Development ビルドで定義される UE_BUILD_DEVELOPMENT もあるので用途に応じて使う。

あるいは UE_BUILD_xxxx シリーズのマクロについて

これらのマクロのシリーズは公式ドキュメント的にはたぶんアンドキュメント。ソースを見るとこのプリフィックスのシリーズは Engine/Source/Runtime/Core/Public/Misc/Build.h に、

  1. UE_BUILD_DEBUG
  2. UE_BUILD_DEVELOPMENT
  3. UE_BUILD_TEST
  4. UE_BUILD_SHIPPING
  5. UE_BUILD_SHIPPIING_WITH_EDITOR
  6. UE_BUILD_DOCS
  7. UE_BUILD_FINAL_RELEASE
  8. UE_BUILD_MINIMAL

の存在を UE-4.16 現在、確認できる。

追記: FORCEINLINE_DEBUGGABLE について

↑までの内容でブログを書いた後もしばらくソースを眺めていると、 FORCEINLINE_DEBUGGABLE マクロの定義もあることに気付いた。これを使うと、

FORCEINLINE_DEBUGGABLE void hogehoge()
{ /* fugafuga */ }

こんな具合で簡単化できて嬉しいのかなー・・・と思ったものの、ちょっと違った。冒頭で紹介した #ifdef の代わりに使ってしまうと FORCEINLINE ほどではないもののデバッグ実行は実際問題としては難しくなってしまう。

UE_BUILD_xxxx シリーズや FORCEINLINE_DEBUGGABLEEngine/Source/Runtime/Core/Public/Misc/Build.h で定義されていて、 FORCEINLINE_DEBUGGABLEFORCEINLINE_DEBUGGABLE_ACTUAL へ置換される。それから Engine/Source/Runtime/Core/Public/HAL/Platform.hFORCEINLINE_DEBUGGABLE_ACTUAL が"未定義"の場合には FORCEINLINE_DEBUGGABLE_ACTUALinline と定義される。

つまり、そんなこんなで少し入り組んでいるものの、ともかく FORCEINLINE_DEBUGGABLE を使うと C++ キーワードの inline と同様の挙動で inline 最適化が指示された関数を定義した事になる。

ちなみに、 FORCEINLINEC++ キーワードの inline ではなくて、コンパイラーの独自拡張によるより強制力の高い inline 関数を指示するキーワードへ置換される UE4 定義のマクロで、例えば cl.exe(MSVC++) なら __forceinline に置換されたりする。UE4 が対応する FORCEINLINE のプラットフォームごとの対応は Engine/Source/Runtime/Core/Public/<PLATFORM>/<PLATFORM>Platform.h でそれぞれに定義されていて、

置換先
Android __attribute__ ((always_inline))
iOS __attribute__ ((always_inline))
Linux __attribute__ ((always_inline))
Mac __attribute__ ((always_inline))
Windows __forceinline

こんな感じに定義されている。

参考

  1. https://github.com/EpicGames/UnrealEngine/blob/4.16/Engine/Source/Runtime/Core/Public/Misc/Build.h
  2. How can I differentiate between Macros for DebugGame Editor vs Development Editor? - UE4 AnswerHub

追記参考

  1. https://github.com/EpicGames/UnrealEngine/blob/4.16/Engine/Source/Runtime/Core/Public/Misc/Build.h