C言語・C++で書いたプログラムをコンパイルするとC2065「識別子 “” が定義されていません」と表示されてコンパイルエラーになることがあります。
中には参考書の通りソースコードをまるごと写したはずなのにエラーが発生してしまって困ってる方もいるでしょう。
そこで今回はC2065「識別子 “” が定義されていません」が発生する原因と対処の方について解説します。
C2065エラーの原因と対処法
C2065エラー「識別子 “” が定義されていません」は存在しない変数や関数を呼び出そうとした際に発生します。なぜ存在しない変数や関数を呼び出そうとしてしまっているのか見ていきましょう。
スペルミスを起こしている
スペルミスを起こした場合もC2065エラーが発生します。
スペルミスを起こした場合は大抵存在しない名前を記述しているはずなので、「定義されていない識別子です」が発生するのです。
#include<stdio.h>
int main() {
//printf関数を書き間違えてprintgになっている
printg("Hello World!"); //C2065
}
C言語の標準ライブラリにはprintg関数なんて存在しないので、自作するかprintg関数があるライブラリを導入しない限りC2065エラーが発生するでしょう。
スペルミスはプログラムを書いた本人は気づきにくいミスです(本人は正しいと思ってタイピングしているため)。ですのでスペルミスの可能性も疑いつつエラー原因を特定するといいでしょう。
関数名に限らず変数名・定数名でも発生するので気をつけるようにしてください。
変数宣言を忘れている
単純に変数宣言を忘れている場合もC2065エラーが発生します。
ありがちなのが、宣言時に型名を書くのを忘れたまま初期値を代入しようとしたときです。
int main() {
nu = 3; //C2065
}
C言語で変数・定数の宣言をするときは型名が必ず必要なので覚えておいてください。
C++では型名を’auto’にすることで自動的に型名が決定されます
auto i = 0; //int
auto f = 1.4f;//float
auto d = 1.4; //double
auto c = 'A'; //char
C言語では使えませんが、C++では有効ですので覚えておきましょう。
スコープ外からアクセスしようとしている
C言語・C++にはスコープの概念がありますが、スコープを抜けている状態でほかのスコープ内の変数や定数にアクセスしようとした場合はC2065エラーが発生します。
int main() {
{
int nu;
}
//スコープを抜けているので変数nuにアクセスできない
nu = 3; //C2065
}
スコープはC言語のプログラムを書く上で非常に重要ですので、適切にif文やfor文などのスコープを管理するようにしましょう。
ヘッダーファイルのインクルードを忘れている
ヘッダーファイルに関数のプロトタイプ宣言やグローバル変数・クラスなどを宣言・定義していてたものの、肝心のヘッダファイルインクルード使用されていた場合、ソースファイルからはヘッダーファイルに記述されている変数名などがわからない状態なのでC2065エラーが発生します。
include 文を間違えている場合は必ず修正するようにしてください。
include文で別のエラーが発生していた場合は、以下の記事が参考になる可能性が高いです。
頻繁に遭遇するエラーのひとつ
C2065「識別子 “” が定義されていません」はプログラムを書いていく上で遭遇することの多いエラーの一つです。
- 変数の宣言部分で型名が抜けていた
- if文内で宣言した変数をif文を抜けてから呼び出そうとした
- ヘッダーファイルを書くだけ書いてインクルードしていなかった
色んな理由で発生してしまうので、C2065「識別子 “” が定義されていません」のエラーはC言語を勉強することにおいて避けて通れない道と思っておきましょう。
統合開発環境(IDE)のオートコンプリート機能を使えば予防しやすい
Visual StudioやEclipse・Android StudioなどのIDEのオートコンプリート機能を使えば変数名や関数名のタイプミスを防ぐことができます。
- 関数名の先頭は大文字だったどうか
- 変数名にアンダーバーを入れてたかどうか
このような確認の手間も防ぐことができます。
オートコンプリート機能を使えばこのように存在する変数や関数を入力候補から選択できるようになるので、 速度もアップします。
IDEを使ってプログラムを書く上でオートコンプリート機能をいかに使いこなすかがポイントなので、手入力だけにこだわらず入力補完機能を有効活用してください。