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

C/C++

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

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

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

C4005の原因

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

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

#define MAX 10

#define MAX 20

int main()
{
  return MAX;
}

 

対処方法は難しくなく、再定義しないようにマクロの管理をするだけで問題ありません。

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

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

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

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

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

#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を使って定義済みマクロを無効化するようにしてください。

Acceliv