5日連続で2つのビッグセール開催中!

【C/C++】C3861「識別子が見つかりませんでした」

3 min

C言語で書いたプログラムをコンパイルするとC3861「識別子が見つかりませんでした」というエラーが発生することがあります。

このエラー発生時エラー文に見つからなかった関数名が表示されますが、ちゃんと関数を実装しているはずなのに何故エラーになったのだろうと不思議に思う方もいるかもしれません。

そこで今回はC3861エラーが発生する原因や、エラーを起こしたくてプログラミングしているわけでもないのにC3861エラーが発生してしまう理由について解説します。

C3861エラー「識別子が見つかりませんでした」とは

C3861エラーの正体は存在しない関数を呼び出そうとした際に発生するエラーです。存在しない関数を呼び出そうとしているためコンパイルエラーとなりビルドが失敗します。

int main()
{
       int a = func(10); //C3861
       return 0;
}
int func(int a)
{
       return a + 1;
}

C言語で呼び出す関数の実装が呼び出している行よりも下にある場合はプロトタイプ宣言が必要です。

上記コードはfunc関数が6行目から実装されているものの、実際にfunc関数を呼び出しているのは3行目です。3行目時点ではfunc関数があるのかどうかわからない状態であるため、存在しない関数を呼び出そうとしていると認識されてC3861エラーが発生するのです。

ですので関数を後で実装する場合は必ずプロトタイプ宣言をして関数の存在を示すようにしてください。

//プロトタイプ宣言
int func(int);

int main()
{
       //C3861エラーは発生しない
       int a = func(10);
       return 0;
}
int func(int a)
{
       return a + 1;
}

C3861エラーは存在しない関数を呼び出そうとしたときに発生するエラーなので、単純にタイピングミスした場合も発生します。注意してください。

C3861エラーを起こしがちな行為

C3861エラーのほとんどはプログラムのコーディングミスで発生します。どういったことが原因で発生してしまいやすいのかを抑えておくと、今後同じミスを繰り返す可能性が減ってくるので、C3861エラーのきっかけとなる行為について紹介します。

クラス名・関数名を変更する

途中でクラス名や関数名を変更した場合、そのクラスを宣言している行や関数を呼び出している行を全て変更する必要があります。

そのため、クラス名や関数名はあまり変更すべきでもありません。それぞれの名前は後で決めるから今は「func1」など仮の名前にしておくという方もいるかもしれませんが絶対にやめましょう。

どうしても変更したい場合

途中でクラス名や関数名を変更したい場合、Visual Studioなら便利な機能が用意されています。

  1. STEP

    変更したい関数名にカーソルを合わせる

    Visual Studioでは選択中の関数に関係するテキストがハイライトされます。

  2. STEP

    F2キーを押す

    選択した状態でF2キーを押すと関数名を変更するウィンドウが開きます。

    「新しい名前」に変更先の関数名を指定し、[プレビュー]をクリックします。

  3. STEP

    変更箇所を確認する

    プレビュー画面では、変更対象の関数が一覧表示され、変換後のプレビューが表示されます。

    最後に[適用]を押すと関数名が一括置換されます。

こちらの方法を使うと、関係のないクラスにある同名の関数は別の関数として認識され、変更が必要な関数名のみ変更が適用されます。

変数や定数に対しても使用可能です。積極的に活用しましょう。

テキストエディタ一括置換ツールは使わないようにしてください。一括置換の場合、同じ関数名が複数のクラスにあった場合、かなり面倒なことになります。

例えば下記のコードにあるクラスAのメンバ関数の名前funcをsumに変える目的で一括置換した場合どうなるでしょうか。

class A
{
       void func(){};
};

class B
{
       void func(){};
};

正解はクラスBのfunc関数名まで変わってしまいます。

絶対にエラーが起きるというわけではありませんが、一括置換が原因でエラーが起きてしまうとエラーを取り除くのが面倒です。

ですので、Visual Studioの機能を使わずにクラス名や関数名を変更したいのであれば、クラス・関数を宣言しているところの名前だけ変更してコンパイルし、意図的にエラーを発生させましょう。

コンパイルエラーは、エラーが発生した行を表示してくれるので、修正が必要なところだけピンポイントで教えてくれます。無駄にエラーを発生させることが減りますので、意図的にコンパイルエラーを発生させることも小ワザとして覚えておくといいかもしれません。

タイピングミス

関数呼び出しのコード、もしくは関数を定義している箇所でタイピングミスをしてしまっている場合、存在しない関数を呼び出そうとしてしまうのでエラーが発生し、コンパイルが失敗します。

int func(int);

int main()
{
       int a = funv(0);
       return 0;
}
int func(int a)
{
       return a + 1;
}

こちらのコードは5行目でfunc関数を呼び出そうとしていますが、入力ミスでfunv関数を呼び出そうとしています。

もちろんfunv関数なんて宣言すらしていないので、C3861「’funv’:識別子が見つかりませんでした」と表示されて、コンパイルエラーになります。

Visual Studioにはインテリセンスという優秀なオートコンプリート機能があるので、関数名の一部を入力した後に入力候補から選択することでタイピングミスを減らすます。

大文字小文字の間違いも起こさなくなるので使いこなせるようにしましょう。