61

宣言されていない識別子エラーとは? 一般的な原因とその修正方法は?

エラー テキストの例:

  • Visual Studio コンパイラの場合:error C2065: 'cout' : undeclared identifier
  • GCC コンパイラの場合:'cout' undeclared (first use in this function)
4

13 に答える 13

94

ほとんどの場合、関数宣言を含むヘッダー ファイルをインクルードするのを忘れたために発生します。たとえば、このプログラムでは「宣言されていない識別子」エラーが発生します。

ヘッダーがありません

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最初の使用前に宣言されていません。これを修正するには、gbeforeの定義を移動しますf:

void g() { }
void f() { g(); }

gまたはbeforeの宣言を追加しfます:

void g(); // declaration
void f() { g(); }
void g() { } // definition

stdafx.h が上にない (VS 固有)

これは Visual Studio 固有です。#include "stdafx.h"VS では、コードの前に追加する必要があります。それ以前のコードはコンパイラによって無視されるため、これがある場合:

#include <iostream>
#include "stdafx.h"

#include <iostream>無視されます。以下に移動する必要があります。

#include "stdafx.h"
#include <iostream>

この回答を自由に編集してください。

于 2014-03-05T11:55:54.320 に答える
3

これらのエラーメッセージ

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 の宣言を認識しないため、このようなエラーを発行しますprintHelloPrintHelloprintHelloは 2 つの異なる名前で、そのうちの 1 つは宣言され、もう 1 つは宣言されていませんが、main の本体で使用されています。

于 2014-03-05T12:10:56.927 に答える
1

別の考えられる状況: テンプレート クラスの親 (テンプレート クラス) メンバーにアクセスする。

修正方法: 親クラス メンバーをフル ネームで使用します (プレフィックスthis->またはparentClassName::メンバーの名前に)。

参照:テンプレート: 継承されたクラスで親クラスのメンバー変数が表示されない

于 2018-10-24T08:29:58.047 に答える
-1

.m と .h に同じパッケージをインポートしているかどうかを確認してください 例: init メソッドに非常に問題があり、.m ファイルに「#import」がないことが原因でした

于 2016-10-17T16:09:45.267 に答える