かすてらすねお。

見聞録的ななにか。

【UE5】UPPER_SNAKE_CASEで変数宣言するとエンジンのマクロ定義と被るリスクがある

次のように MAX_VOLUMEMIN_VOLUME というクラス変数を定義すると、MAX_VOLUME だけエラーが出た。

static float MAX_VOLUME; // DeclarationError: Identifier already declared
static float MIN_VOLUME; // no error

フォーラムの投稿によると、MAX_VOLUME はエンジンで定義されているマクロらしい*1

It seems that UE4\Engine\Source\Runtime\Engine\Public\Audio.h defines a macro called MAX_VOLUME… it might be conflicting with that (given your syntax highlighter made it purple, I'm guessing it is).

(Audio.h で定義されている MAX_VOLUME マクロと競合しているようです…(シンタックスハイライトで紫色になっているのでそうかも)。)

Could you try adding #undef MAX_VOLUME above your class declaration to see if the issue goes away then.

(クラス宣言の上に #undef MAX_VOLUME を追加してみれば問題は解決するかもしれません。)

投稿は UE4 の話だが、たしかに UE5 のコードにも AudioDefines.h で定義されている*2

#define MAX_VOLUME                      4.0f

しかし、投稿で提案されている #undef はいくつか問題があるだろう。

  1. エンジン内の他の場所で使われているマクロをを解除すると予期せぬ影響が出る
  2. なぜ #undef が必要なのか、後から見返した時に分かりづらい
  3. エンジンに依存するコードはアップデート時に問題が起きる可能性がある

Unreal のマクロ定数は UPPER_SNAKE_CASE で定義されているので、UPPER_SNAKE_CASE で命名しなければバッティングすることはなくなる。

そもそも、Unreal のコーディング規約では、変数を UPPER_SNAKE_CASE ではなく CamelCase で命名しなければならない*3

今回の場合、初めからコーディング規約を守っておけば時間を奪われずに済んだのだ。

static float MaxVolume;
static float MinVolume;

Follow me on X: @suneo3476Web