webentwicklung-frage-antwort-db.com.de

Was ist ein "nicht deklarierter Bezeichner" Fehler und wie kann ich ihn beheben?

Was sind nicht deklarierte Kennungsfehler? Was sind häufige Ursachen und wie kann ich diese beheben?

Beispielfehlertexte:

  • Für den Visual Studio-Compiler: error C2065: 'cout' : undeclared identifier
  • Für den GCC-Compiler: 'cout' undeclared (first use in this function)
40
sashoalm

Sie kommen meistens aus dem Vergessen, die Header-Datei einzuschließen, die die Funktionsdeklaration enthält. Dieses Programm gibt beispielsweise den Fehler "nicht deklarierter Bezeichner" aus:

Fehlende Kopfzeile

int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

Um dies zu beheben, müssen wir den Header einfügen:

#include <iostream>
int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

Wenn Sie den Header geschrieben und richtig eingefügt haben, enthält der Header möglicherweise das falsche include guard .

Weitere Informationen finden Sie unter http://msdn.Microsoft.com/de-de/library/aa229215(v=vs.60).aspx .

Falsch geschriebene Variable

Eine weitere häufige Fehlerquelle für Anfänger tritt auf, wenn Sie eine Variable falsch geschrieben haben:

int main() {
    int aComplicatedName;
    AComplicatedName = 1;  /* mind the uppercase A */
    return 0;
}

Falscher Umfang

Dieser Code würde beispielsweise einen Fehler ergeben, da Sie std::string verwenden müssen:

#include <string>

int main() {
    std::string s1 = "Hello"; // Correct.
    string s2 = "world"; // WRONG - would give error.
}

Verwenden Sie vor der Deklaration

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

g wurde vor der ersten Verwendung nicht deklariert. Um dies zu beheben, verschieben Sie entweder die Definition von g vor f:

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

Oder fügen Sie eine Deklaration von g vor f hinzu:

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

stdafx.h nicht an der Spitze (VS-spezifisch)

Dies ist Visual Studio-spezifisch. In VS müssen Sie vor jedem Code #include "stdafx.h" hinzufügen. Code, bevor er vom Compiler ignoriert wird. Wenn Sie also Folgendes haben:

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

Der #include <iostream> würde ignoriert. Sie müssen es unten verschieben:

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

Fühlen Sie sich frei, diese Antwort zu bearbeiten.

57
sashoalm

Betrachten Sie eine ähnliche Situation im Gespräch. Stellen Sie sich vor, Ihr Freund sagt Ihnen: "Bob kommt zum Abendessen herüber", und Sie haben keine Ahnung, wer Bob ist. Du wirst verwirrt sein, richtig? Ihr Freund hätte sagen sollen: "Ich habe einen Arbeitskollegen namens Bob. Bob kommt zum Abendessen herüber." Jetzt wurde Bob erklärt und Sie wissen, von wem Ihr Freund spricht.

Der Compiler gibt den Fehler "nicht deklarierter Bezeichner" aus, wenn Sie versucht haben, einen Bezeichner zu verwenden (was der Name einer Funktion, einer Variablen, einer Klasse usw. sein würde) und der Compiler keine Deklaration dafür gesehen hat. Der Compiler hat also keine Ahnung, worauf Sie sich beziehen, weil er es noch nicht gesehen hat.

Wenn Sie einen solchen Fehler in C oder C++ erhalten, bedeutet dies, dass Sie dem Compiler nicht von der Sache erzählt haben, die Sie verwenden möchten. Deklarationen werden häufig in Header-Dateien gefunden, was bedeutet, dass Sie wahrscheinlich nicht den entsprechenden Header angegeben haben. Natürlich kann es sein, dass Sie sich überhaupt nicht daran erinnern, die Entität überhaupt zu deklarieren.

Einige Compiler geben je nach Kontext spezifischere Fehler an. Wenn Sie beispielsweise versuchen, X x; zu kompilieren, wenn der Typ X nicht mit clang deklariert wurde, wird Ihnen "unbekannter Typname X" angezeigt. Dies ist viel nützlicher, da Sie wissen, dass es versucht, X als Typ zu interpretieren. Wenn Sie jedoch int x = y; haben, wo y noch nicht deklariert ist, wird Ihnen "Verwendung des nicht deklarierten Bezeichners y" angezeigt, da einige Unklarheiten darüber bestehen, was genau y bedeuten kann.

12

Ich hatte das gleiche Problem mit einer benutzerdefinierten Klasse, die in einem Namespace definiert wurde. Ich habe versucht, die Klasse ohne den Namespace zu verwenden. Der Compiler-Fehler "Bezeichner" MyClass "ist undefiniert" . Hinzufügen 

using namespace <MyNamespace>

oder mit der Klasse wie

MyNamespace::MyClass myClass;

problem gelöst. 

5

In C und C++ müssen alle Namen deklariert werden, bevor sie verwendet werden. Wenn Sie versuchen, den Namen einer Variablen oder einer Funktion zu verwenden, die nicht deklariert wurde, wird der Fehler "Nicht deklarierter Bezeichner" angezeigt.

Funktionen sind jedoch ein Sonderfall in C (und nur in C), da Sie sie nicht zuerst deklarieren müssen. Der C-Compiler geht davon aus, dass die Funktion mit der Anzahl und dem Typ der Argumente wie im Aufruf vorhanden ist. Wenn die tatsächliche Funktionsdefinition nicht übereinstimmt, wird ein weiterer Fehler angezeigt. Dieser Sonderfall für Funktionen ist in C++ nicht vorhanden.

Sie beheben diese Art von Fehlern, indem Sie sicherstellen, dass Funktionen und Variablen vor ihrer Verwendung deklariert werden. Im Fall von printf müssen Sie die Header-Datei <stdio.h> (oder <cstdio> in C++) angeben.

Für Standardfunktionen empfehle ich Ihnen, z. diese Referenzseite und suchen Sie nach den Funktionen, die Sie verwenden möchten. In der Dokumentation zu jeder Funktion erfahren Sie, welche Header-Datei Sie benötigen.

Diese Fehlermessungen

1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)

bedeutet, dass Sie den Namen printf verwenden, aber der Compiler sieht nicht, wo der Name deklariert wurde und weiß daher nicht, was er bedeutet.

Jeder Name, der in einem Programm verwendet wird, muss vor seiner Verwendung angegeben werden. Der Compiler muss wissen, was der Name bedeutet.

In diesem Fall sieht der Compiler die Deklaration des Namens printf nicht. Wie wir wissen (aber nicht den Compiler), ist dies der Name der Standard-C-Funktion, die im Header <stdio.h> in C oder im Header <cstdio> in C++ deklariert und in standard (std::) und globale (::) (nicht notwendigerweise) Namensräume gesetzt wird.

Bevor Sie diese Funktion verwenden, müssen Sie dem Compiler ihre Namensdeklaration bereitstellen, indem Sie die entsprechenden Header hinzufügen.

Zum Beispiel 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" );
}

Manchmal ist der Grund für einen solchen Fehler ein einfacher Tippfehler. Nehmen wir zum Beispiel an, dass Sie die Funktion PrintHello definiert haben.

void PrintHello()
{
    std::printf( "Hello World\n" );
}

aber in main haben Sie einen Tippfehler gemacht und statt PrintHello haben Sie printHello mit Kleinbuchstaben 'p' eingegeben. 

#include <cstdio>

void PrintHello()
{
    std::printf( "Hello World\n" );
}

int main()
{
   printHello();
}

In diesem Fall gibt der Compiler einen solchen Fehler aus, da die Deklaration des Namens printHello nicht angezeigt wird. PrintHello und printHello sind zwei verschiedene Namen, von denen einer deklariert wurde und der andere nicht deklariert, sondern im Hauptteil von main verwendet wird

3

Eine andere mögliche Situation: Zugriff auf das übergeordnete Mitglied (eine Vorlagenklasse) in einer Vorlagenklasse.

Fix-Methode: Verwenden des übergeordneten Klassenmitglieds anhand des vollständigen Namens (indem dem Namen des Elements this-> oder parentClassName:: ein Präfix vorangestellt wird).

siehe: templates: übergeordnete Klassenmitgliedsvariablen in geerbter Klasse nicht sichtbar

1
phil

Jede nicht deklarierte Variable in c-Fehler tritt auf, weil der Compiler sie nicht im Projekt finden kann. Die externe (Header-) Datei der Bibliothek, in der die Variable definiert ist, kann enthalten sein. Daher benötigen Sie in Ihrer Frage <stdio.h>, dh eine Standardeingabedatei, die die Funktionalität von printf () beschreibt.

Gemäß der Dokumentation ist die Deklaration von fprintf () in enthalten, d. H. Sie müssen sie vor der Verwendung der Funktion einfügen.

0
Ishmeet

Wenn Sie sich sehr sicher sind, dass Sie die betreffende Bibliothek importiert haben, werden Sie in Visual Studio mit IntelliSense geführt.

Folgendes hat für mich funktioniert:

Stellen Sie sicher, dass #include "stdafx.h" zuerst deklariert wird, d. H. Oben in allen Include-Dateien.

0
Declan Nnadozie

Ein C++ - Bezeichner ist ein Name, der zur Identifizierung einer Variablen, Funktion, Klasse, eines Moduls oder eines anderen benutzerdefinierten Elements verwendet wird. In C++ müssen alle Namen deklariert werden, bevor sie verwendet werden. Wenn Sie versuchen, den Namen eines solchen zu verwenden, der noch nicht deklariert wurde, wird ein Kompilierungsfehler "nicht deklarierter Bezeichner" angezeigt.

Entsprechend der Dokumentation ist die Deklaration von printf () in cstdio enthalten, d. H. Sie müssen sie vor der Verwendung der Funktion einfügen.

0
Amit G.

Es ist wie die Verwendung der Funktion, ohne sie zu deklarieren. Die Header-Datei enthält die Funktion printf (). Fügen Sie die Header-Datei in Ihr Programm ein. Dies ist die Lösung für das .. _. Einige benutzerdefinierte Funktionen können auch fehlerhaft sein, wenn sie nicht vor der Verwendung deklariert werden. Wenn Wird global keine Probs verwendet. 

0
Q_SaD