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

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4: クラスファイルにたいてい仕込むログマクロの糖衣マクロ

UE4C++ コードファイルを追加する場合、特に UCLASS では規模がよほど小さくない限りたいてい定義するログマクロの定義と糖衣を紹介。

// MyHoge.h
// コンパイラーオプションで MYHOGE_ENABLE_LOG=1 など明示的に渡されない場合でも
// デバッグビルドの場合にはログマクロを ON にする
#if defined( UE_BUILD_DEBUG ) && ! defined( MYHOGE_ENABLE_LOG)
  #define MYHOGE_ENABLE_LOG 1
#endif

// ログマクロを有効にする場合
#if MYHOGE_ENABLE_LOG > 0
  /// ログONの場合のログマクロラッパー定義
  DECLARE_LOG_CATEGORY_EXTERN( MYHOGE, Log, All );
#endif
// .cpp
// ログマクロを有効にする場合
#if MYHOGE_ENABLE_LOG > 0
  // ログカテゴリー定義
  DEFINE_LOG_CATEGORY( MYHOGE );
  // このソース内でのみ有効なログマクロ書き糖衣マクロ
  #ifndef LOG
    #define LOG( LEVEL, BODY, ... ) \
      { UE_LOG( MYHOGE, LEVEL, TEXT( BODY ), __VA_ARGS__ ) }
  #endif
// ログOFFの場合のログマクロラッパー定義
#else
  #ifndef LOG
    #define LOG( ... ) 
  #endif
#endif

この仕込みを施したならば、 .cpp でログを仕込む際には LOG( "hoge %s %f", *something_string, something_float ) と書くだけでよい。UE_LOG{ }ブロックスコープにしてあるので、 if ( x ) LOG( "hoge" ) のように使っても翻訳に支障もない。MYHOGE_ENABLE_LOG を明示的に制御したい場合は "{your-project-name}.Build.cs に DefinitionsAdd すればよい。