【C/C++】C4002「関数に似たマクロ呼び出し ‘sum’ の引数が多すぎます」の対処法

C/C++

C言語・C++のプログラムを書いていて、C4002警告に遭遇したことはありませんか?

コンパイルエラーではなく警告であるため、問題なくビルドできて実行もできるわけですが、この警告が出る場合プログラムの書き方を間違えています。

ここではC4002エラーの正体と解決方法について解説します。

C4002警告とは?

C4002エラーはマクロ関数呼び出しに関する警告で、コンパイルには影響がないものの書き方は間違っている際に表示されます。

#include <iostream>
#define sum(a) a+a;
int main()
{
    std::cout << sum(10,20);
}

このプログラムはC4002警告が出てしまう間違ったコードですが、何が問題かわかるでしょうか?

答えは5行値のsumマクロ関数呼び出し時に指定している引数が多すぎることが原因です。

このコードで作成しているsum関数は、引数を1つしか受け取らないにもかかわらず、5行目の呼び出し時には2つの引数が指定されています。

その影響で警告が出てしまうのです。

なぜコンパイルエラーにならないのか

理由は簡単。コンパイル時に無視されているからです。

マクロ関数というのはコンパイル時に展開されますが、不必要な引数は無視されるので、コンパイルに影響がないのです。

#include <iostream>
#define sum(a) a+a;
int main()
{
    //std::cout << sum(10, 20);
    //↑のsum関数展開後のコード
    std::cout << 10+10;
}

そのためコンパイルエラーにはなりませんが、書き方を間違っているのはまずいということでC4002警告が表示されるようになっています。

ですので、「C4002警告=マクロ関数に渡す引数が多すぎる」と覚えておくと良いでしょう。

Acceliv