【C/C++】C4005「マクロが再定義されました」の原因と対処法

C/C++で書いたプログラムをコンパイル・ビルドするとC4003コード「マクロが再定義されました」という警告が表示されることがあります。

マクロを再定義した覚えがないのに、この警告が出ることもあり、初心者キラーな警告メッセージでもあります。

ここではC4005の警告への対処法について詳しく掘り下げていますので、C4005警告について知っていきましょう。

目次から探す

C4005の原因

原因は、警告文の書かれている通り、同じマクロを複数回定義したことが原因です。

例えば以下のプログラムはマクロの再定義によりC4005警告が発生します。

#define MAX 10

#define MAX 20 //C4005

int main()
{
  return MAX;
}

対処方法は難しくなく、同じマクロを2つ以上書かないように気をつける、書いてしまった場合は1つになるようにコードを削除するだけで問題ありません。

マクロを再定義した時の挙動

マクロを再定義してしまったとき、一つ気になることがあります。

  • 最初に定義したマクロが使われるのか
  • 再定義したマクロが優先されるのか

万が一マクロが再定義してしまったときに備えて、マクロの再定義時の挙動を知っておきましょう。

答えを先に言ってしまうと、再定義したマクロが優先されます。

#define MAX 10

#define MAX 20

int main()
{

  switch (MAX)
  {
  case 10:
    return 100;
    break;
  case 20:
    return 200;
    break;
  default:
    break;
  }

  return 0;
}

こちらのコードだと、MAXの値は20としてコンパイルされて実行されます。

基本的に、マクロを再定義すると上書きされるということを覚えておきましょう。

複数定義していないのに警告が出る場合

自分が書いたプログラムのどこを見ても、同じマクロを複数回定義しているのを見つけられないということもあるでしょう。

そういう場合は、インクルードしているヘッダーファイルに定義されているマクロと競合している可能性があります

例えば以下のコードは、マクロを複数回定義していないように見えて、再定義しています。

#include <Windows.h>

#define max 99

int main()
{
  return 0;
}

このプログラムでインクルードしているwindows.hにはmaxマクロ関数が定義されているため、マクロの再定義と判定されてC4005警告が出てしまうのです。

こういった、インクルードしているファイルのプログラムの影響でマクロの再定義警告が表示されてしまうことがあるので、覚えておいてください。

C4005警告なしでマクロを再定義したい場合

何らかの理由で、既存のマクロを上書きしたいという事があると思います。

その場合は、#undefプリプロセッサを使って定義済みマクロを無効化してから再定義するようにしましょう。

そうすることでC4005警告が発生しなくなります。

#define max 99
#undef max
#define max 10000

int main()
{
  return 0;
}

警告文が一つでもあると気持ち悪い、全部消したいという方は#undefを使って定義済みマクロを無効化するようにしてください。

目次から探す