宣言されていない識別子エラーとは? 一般的な原因とその修正方法は?
エラー テキストの例:
- Visual Studio コンパイラの場合:
error C2065: 'cout' : undeclared identifier
- GCC コンパイラの場合:
'cout' undeclared (first use in this function)
宣言されていない識別子エラーとは? 一般的な原因とその修正方法は?
エラー テキストの例:
error C2065: 'cout' : undeclared identifier
'cout' undeclared (first use in this function)
ほとんどの場合、関数宣言を含むヘッダー ファイルをインクルードするのを忘れたために発生します。たとえば、このプログラムでは「宣言されていない識別子」エラーが発生します。
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
これを修正するには、ヘッダーを含める必要があります。
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
ヘッダーを作成して正しくインクルードした場合、ヘッダーに間違ったインクルード ガードが含まれている可能性があります。
詳細については、 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
beforeの定義を移動しますf
:
void g() { }
void f() { g(); }
g
またはbeforeの宣言を追加しf
ます:
void g(); // declaration
void f() { g(); }
void g() { } // definition
これは Visual Studio 固有です。#include "stdafx.h"
VS では、コードの前に追加する必要があります。それ以前のコードはコンパイラによって無視されるため、これがある場合:
#include <iostream>
#include "stdafx.h"
は#include <iostream>
無視されます。以下に移動する必要があります。
#include "stdafx.h"
#include <iostream>
この回答を自由に編集してください。
これらのエラーメッセージ
1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)
name を使用することを意味しますprintf
が、コンパイラは名前が宣言された場所を認識しないため、その意味がわかりません。
プログラムで使用される名前は、使用する前に宣言する必要があります。コンパイラは、名前が何を意味するかを知る必要があります。
この特定のケースでは、コンパイラは name の宣言を認識しませんprintf
。私たちが知っているように (ただしコンパイラーではありません)、これは C の<stdio.h>
ヘッダーまたは<cstdio>
C++ のヘッダーで宣言され、標準 ( std::
) およびグローバル ( ::
) (必ずしもそうではありません) の名前空間に配置された標準 C 関数の名前です。
したがって、この関数を使用する前に、対応するヘッダーを含めて、その名前宣言をコンパイラーに提供する必要があります。
たとえば 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" );
}
しかし、主にタイプミスを犯し、代わりに小文字の「p」PrintHello
を入力しました。printHello
#include <cstdio>
void PrintHello()
{
std::printf( "Hello World\n" );
}
int main()
{
printHello();
}
この場合、コンパイラは name の宣言を認識しないため、このようなエラーを発行しますprintHello
。 PrintHello
とprintHello
は 2 つの異なる名前で、そのうちの 1 つは宣言され、もう 1 つは宣言されていませんが、main の本体で使用されています。
別の考えられる状況: テンプレート クラスの親 (テンプレート クラス) メンバーにアクセスする。
修正方法: 親クラス メンバーをフル ネームで使用します (プレフィックスthis->
またはparentClassName::
メンバーの名前に)。
.m と .h に同じパッケージをインポートしているかどうかを確認してください 例: init メソッドに非常に問題があり、.m ファイルに「#import」がないことが原因でした