Visual C++のエラー 傾向と対策

Visual C++での開発中に遭遇するエラーについて、そのよくある原因と対策とを収集するブログです

error C2065の傾向と対策:変数の宣言忘れ or 名前空間の指定忘れかも

C++は静的型付け言語であり、変数の宣言時にその変数の型を決めてやる必要があります。例えば以下のコード

#include <iostream>

int main() {
    a = 7;
    std::cout << a << std::endl;
    return 0;
}

では変数aの型が指定されていないため、以下のエラーが出ます。

error C2065: 'a': 定義されていない識別子です。

このエラーを回避するには、aの型を指定します。

    int a = 7;

また、ある名前空間の下にある変数や関数を、名前空間の指定を忘れて使おうとしたときにもC2065エラーが出ます。例えば以下のコード

#include <iostream>

int main() {
    int a = 7;
    std::cout << a << endl;
    return 0;
}

では、endlstd::をつけ忘れたため、やはり以下のエラーが出ます。

error C2065: 'endl': 定義されていない識別子です。

このエラーを回避するには、正しく名前空間を指定します。

    std::cout << a << std::endl;

error C4700の傾向と対策:値を初期化していない変数を使っているかも

C++では変数を定義しただけではその変数の値は不定、つまり変数にどんな値が入っているかわかりません。値が不定な変数を使うのはバグの温床になるため、Visual Studioはデフォルトでこのような変数に対してエラーを出してくれます。

例えば以下のコード

int main() {
    int a;
    a += 3;
    return 0;
}

では、int a;した段階ではaは不定であるにもかかわらず、次の行a += 3aに3を足す処理を行ったため、以下のエラーが発生します。

 error C4700: 初期化されていないローカル変数 'a' が使用されます

エラーを消すためには、変数の定義時に適当な初期値を代入すればOKです。以下のコードは問題なくコンパイルできます。

int main() {
    int a = 0;
    a += 3;
    return 0;
}

error LNK1561の傾向と対策:main関数を忘れている or 構成の種類が誤っている かも

プロジェクトをビルドしようとしたとき、以下のエラーメッセージが出ることがあります。

error LNK1561: エントリー ポイントを定義しなければなりません。

エントリーポイントとは平たくいえばmain関数とかWinMain関数のことです。まずはmain関数を書き忘れていないか確認してください。

もしもあなたが実行ファイルではなく、スタティックライブラリ(.lib)やダイナミックライブラリ(.dll)を作ることを意図しているのなら、プロジェクトの「構成の種類」が「アプリケーション (.exe)」になっていることがエラーの原因かもしれません。以下の方法により修正可能です。

  • 該当するDLL作成プロジェクトのプロパティを開く
  • 「全般」の「構成の種類」を意図するもの(「スタティックライブラリ(.lib)」または「ダイナミック ライブラリ(.dll)」)に変える

error C2143の傾向と対策:変数の定義位置がおかしいかも

Cプログラムを書いているとしょっちゅうC2143エラーに遭遇します。

error C2143: 構文エラー : ';' が '型' の前にありません。

一番多い原因は、おそらく変数の定義位置がブロック先頭にないことだと思います。

int main(void){
    int a = 0;
    ++a;
    int b = 0; // C2143: 定義位置がブロック先頭ではない

    return 0;
}

エラーを取り除くためには以下のように書かないといけません。

int main(void){
    int a = 0;
    int b = 0;
    ++a;

    return 0;
}

これはVisual Studio 2012以前のVC++コンパイラがC99規格に完全対応していなかったのが原因です。Visual Studio 2013ではC99への対応が進んだらしく、冒頭のコードでC2143エラーは発生しません。