未宣言識別子エラーとは何ですか?また、どのように修正すればよいですか?
エラー文の例
'cout' undeclared (この関数で最初に使用)
.例えば、このプログラムでは 'undeclared identifier' というエラーが発生します。
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
修正するには、ヘッダーを入れる必要があります。
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
ヘッダーを書き、正しくインクルードした場合、ヘッダーに間違ったinclude guardが含まれている可能性があります。
詳しくは、http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx をご覧ください。
また、変数のスペルを間違えてしまった場合も、ビギナーズエラーになりがちです。
int main() {
int aComplicatedName;
AComplicatedName = 1; /* mind the uppercase A */
return 0;
}
例えば、このコードでは std::string
を使用する必要があるため、エラーが発生します。
#include <string>
int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}
void f() { g(); }
void g() { }
gは最初に使用される前に宣言されていません。これを修正するには、
gの定義を
f` の前に移動してください。
void g() { }
void f() { g(); }
または、f
の前に g
の宣言を追加してください。
void g(); // declaration
void f() { g(); }
void g() { } // definition
これは、Visual Studio固有のものです。VSでは、どのコードの前にも #include "stdafx.h"
を追加する必要があります。その前のコードはコンパイラに無視されますので、このような場合は
#include <iostream>
#include "stdafx.h"
include
#include "stdafx.h"
#include <iostream>
Feel free to edit this answer.
会話でも同様の状況を考えてみましょう。 友達が「ボブが夕食にやってくる」と言って、ボブが誰なのかわからないと想像してみてください。 混乱するでしょう? あなたの友人は、「ボブと呼ばれる同僚がいます。 ボブは夕食に来ています。「今、ボブは宣言されており、あなたはあなたの友人が誰について話しているのか知っています。
コンパイラは、識別子(関数、変数、クラスなどの名前は何)を使用しようとしたときに「宣言されていない識別子」エラーを放射します。)そして、コンパイラーはそれのための宣言を見ていません。 つまり、コンパイラはこれまで見たことがないため、何を参照しているのかわかりません。
CまたはC ++でこのようなエラーが発生した場合は、使用しようとしていることについてコンパイラーに伝えていないことを意味します。 宣言はヘッダーファイルによく見られるため、適切なヘッダーを含めていない可能性があります。 もちろん、エンティティを宣言することをまったく覚えていない可能性があります。
一部のコンパイラは、コンテキストに応じてより具体的なエラーを提供します。 たとえば、タイプ X
がclangで宣言されていない X x;
をコンパイルしようとすると、「不明なタイプ名 X
」が表示されます。 これは、「X」をタイプとして解釈しようとしていることを知っているため、はるかに便利です。 ただし、「int x = y;」がある場合、「y」はまだ宣言されていませんが、「y」が正確に何を表すかについて曖昧さがあるため、「宣言されていない識別子「y」の使用」がわかります。
CおよびC++では、すべての名前は使用する前に宣言する必要があります。宣言されていない変数や関数の名前を使おうとすると、quot;undeclared identifier"というエラーが発生します。
しかし、関数はC言語では特殊なケースで、最初に宣言する必要がありません(C言語のみ)。Cコンパイラは、呼び出し時の引数の数と型から、その関数が存在すると判断します。もし、実際の関数定義がそれと一致しない場合は、別のエラーが発生します。このような関数の特別なケースはC++には存在しません。
この種のエラーは、関数や変数が使用される前に宣言されていることを確認することで修正します。printfの場合は、ヘッダーファイル
<stdio.h>(C++では
標準的な関数については、この資料のサイトなどで、使いたい関数を検索してみることをお勧めします。各関数のドキュメントには、どのようなヘッダーファイルが必要なのかが書かれています。
これらのエラーのミーセージ。
1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)
つまり、名前「printf」を使用しますが、コンパイラは名前が宣言された場所を確認しないため、その意味がわかりません。
プログラムで使用される名前は、使用する前に宣言する必要があります。 コンパイラは、名前が何を意味するかを知る必要があります。
この特定のケースでは、コンパイラには名前「printf」の宣言が表示されません。 . 私たちが知っているように(コンパイラではありません)、Cのヘッダー < stdio.h>
またはC ++のヘッダー < cstdio>
で宣言され、標準( std ::
)およびグローバル(::
)(必ずしもそうではない)名前空間。
したがって、この関数を使用する前に、対応するヘッダーを含めることにより、その名前宣言をコンパイラに提供する必要があります。
例えば。 C:。
#include <stdio.h>
int main( void )
{
printf( "Hello World\n" );
}
C ++:。
#include <cstdio>
int main()
{
std::printf( "Hello World\n" );
// or printf( "Hello World\n" );
// or ::printf( "Hello World\n" );
}
このようなエラーの理由は、単純なタイプミスです。 たとえば、関数「PrintHello」を定義したとします。
void PrintHello()
{
std::printf( "Hello World\n" );
}
ただし、主にタイプミスを作成し、「PrintHello」の代わりに「printHello」を小文字「p」で入力しました。
#include <cstdio>
void PrintHello()
{
std::printf( "Hello World\n" );
}
int main()
{
printHello();
}
この場合、コンパイラは「printHello」という名前の宣言が表示されないため、このようなエラーを発行します。 PrintHello
と printHello
は2つの異なる名前で、そのうちの1つは宣言され、もう1つは宣言されていませんが、本文で使用されています。
別の考えられる状況:テンプレートクラスの親(テンプレートクラス)メンバーにアクセスします。
修正方法:親クラスメンバーをフルネームで使用します(メンバーの名前に対して「this->」または「parentClassName ::」を接頭辞で示します)。
参照:https://stackoverflow.com/questions/6592512/templates-parent-class-member-variables-not-visible-in-inherited-class?noredirect = 1& lq = 1。
コンパイラーがプロジェクトでそれを見つけることができないため、cエラーの宣言されていない変数はすべて発生します。 変数が定義されているライブラリの外部(ヘッダー)ファイルを含めることができます。 したがって、質問では、標準の入力出力ファイルである「< stdio.h>」が必要です。これは、printf()、機能を説明する標準入力出力ファイルです。
ドキュメントによると、fprintf()の宣言は< cstdio>にあります。つまり. 関数を使用する前に、それを含める必要があります。
ほとんどの場合、問題のライブラリをインポートしたと確信している場合は、Visual StudioがIntelliSenseをガイドします。
これが私のために働いたものです:
#include "stdafx.h"
が最初に宣言されていること、つまりすべてのインクルードの上部にあることを確認してください。