Was ist ein „nicht deklarierter Bezeichner“-Fehler und wie behebe ich ihn?

Lesezeit: 7 Minuten

Was ist ein „nicht deklarierter Bezeichner Fehler und wie behebe ich
sashoalm

Was sind nicht deklarierte ID-Fehler? Was sind häufige Ursachen und wie behebe ich sie?

Beispielfehlertexte:

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

  • Ein sehr häufiger Fall ist einschließlich <iostream> und versucht zu verwenden std::string ohne zu haben <string> inbegriffen. Vielleicht erwähnenswert.

    – πάντα ῥεῖ

    5. März 2014 um 12:12 Uhr

Sie kommen meistens daher, dass vergessen wurde, die Header-Datei einzuschließen, die die Funktionsdeklaration enthält, zum Beispiel gibt dieses Programm einen „nicht deklarierten Bezeichner“-Fehler aus:

Kopfzeile fehlt

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

Um das Problem 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 richtig geschrieben und eingefügt haben, enthält der Header möglicherweise das Falsche Wächter beinhalten.

Um mehr zu lesen, siehe http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.

Falsch geschriebene Variable

Eine weitere häufige Quelle für Anfängerfehler 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 ausgeben, weil Sie verwenden müssen std::string:

#include <string>

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

Verwendung vor Deklaration

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

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

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

Oder fügen Sie eine Erklärung hinzu g Vor f:

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

stdafx.h nicht oben (VS-spezifisch)

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

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

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

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

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

  • Die Leute sollten andere Antworten nicht bearbeiten, korrigieren Sie sie einfach, wenn sie falsch sind, oder lassen Sie sie besser aussehen … , aber Sie können gerne eine Antwort hinzufügen, die etwas anderes enthält, und Sie können sie Ihrer Antwort hinzufügen und erwähnen, dass dieser Teil von xxx

    – Robert

    11. Juni 2016 um 20:51 Uhr


  • Ich habe gerade ein paar Stunden damit verschwendet, ein ähnliches Problem zu betrachten, und in meinem Fall hatte es damit zu tun, dass Header Guards nicht korrekt waren.

    – Jad

    13. Oktober 2016 um 17:18 Uhr


  • Ein weiterer kniffliger Fall, der zu diesem Fehler führt: stackoverflow.com/a/6592617/6165833

    – ymoreau

    1. August 2017 um 10:01 Uhr

  • Eine andere Sache, auf die Sie achten sollten, sind Querverweise

    – enkara

    6. Februar 2018 um 11:20 Uhr

Was ist ein „nicht deklarierter Bezeichner Fehler und wie behebe ich
Josef Mansfeld

Betrachten Sie eine ähnliche Situation in einem Gespräch. Stellen Sie sich vor, Ihr Freund sagt zu Ihnen: „Bob kommt zum Abendessen vorbei“, und Sie haben keine Ahnung, wer Bob ist. Du wirst verwirrt sein, oder? Ihr Freund hätte sagen sollen: „Ich habe einen Arbeitskollegen namens Bob. Bob kommt zum Abendessen vorbei.“ Jetzt wurde Bob deklariert und Sie wissen, von wem Ihr Freund spricht.

Der Compiler gibt einen „nicht deklarierten Bezeichner“-Fehler aus, wenn Sie versucht haben, einen Bezeichner zu verwenden (was wäre der Name einer Funktion, Variablen, Klasse usw.) und der Compiler keine Deklaration dafür gesehen hat. Das heißt, der Compiler hat keine Ahnung, worauf Sie sich beziehen, weil er es vorher noch nicht gesehen hat.

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

Einige Compiler geben je nach Kontext spezifischere Fehler aus. Zum Beispiel versuchen zu kompilieren X x; wo der Typ X wurde nicht mit clang deklariert, sagt Ihnen “unbekannter Typname X“. Dies ist viel nützlicher, weil Sie wissen, dass es versucht zu interpretieren X als Typ. Allerdings, wenn Sie haben int x = y;wo y noch nicht deklariert ist, wird es Ihnen sagen “Verwendung einer nicht deklarierten Kennung y“, weil es einige Unklarheiten darüber gibt, was genau y darstellen könnte.

Was ist ein „nicht deklarierter Bezeichner Fehler und wie behebe ich
Irgendein Programmierer

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, erhalten Sie den Fehler “nicht deklarierter Bezeichner”.

Funktionen sind jedoch in C (und nur in C) ein Sonderfall, da Sie sie nicht zuerst deklarieren müssen. Der C-Compiler geht davon aus, dass die Funktion mit der Anzahl und Art der Argumente wie beim Aufruf vorhanden ist. Wenn die tatsächliche Funktionsdefinition nicht damit übereinstimmt, erhalten Sie einen weiteren Fehler. Dieser Sonderfall für Funktionen existiert in C++ nicht.

Sie beheben diese Art von Fehlern, indem Sie sicherstellen, dass Funktionen und Variablen deklariert werden, bevor sie verwendet werden. Im Falle des printf Sie müssen die Header-Datei einschließen <stdio.h> (oder <cstdio> in C++).

Für Standardfunktionen empfehle ich Ihnen, z diese Referenzseite, und suchen Sie nach den Funktionen, die Sie verwenden möchten. Die Dokumentation für jede Funktion sagt Ihnen, welche Header-Datei Sie benötigen.

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, was den Compilerfehler verursacht hat “Bezeichner “MyClass” ist undefiniert”. Hinzufügen

using namespace <MyNamespace>

oder mit der Klasse like

MyNamespace::MyClass myClass;

Problem gelöst.

1646951415 718 Was ist ein „nicht deklarierter Bezeichner Fehler und wie behebe ich
Vlad aus Moskau

Diese Fehlermeldungen

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 Namen verwenden printf aber der Compiler sieht nicht, wo der Name deklariert wurde und weiß dementsprechend nicht, was er bedeutet.

Jeder in einem Programm verwendete Name muss vor seiner Verwendung deklariert werden. Der Compiler muss wissen, was der Name bedeutet.

In diesem speziellen Fall sieht der Compiler die Deklaration des Namens nicht printf . Wie wir wissen (aber nicht der Compiler), ist dies der Name der im Header deklarierten Standard-C-Funktion <stdio.h> in C oder im Header <cstdio> in C++ und in Standard (std::) und global (::) (nicht unbedingt) Namensräume.

Bevor wir diese Funktion verwenden, müssen wir dem Compiler ihre Namensdeklaration zur Verfügung stellen, indem wir entsprechende Header einfü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, Sie haben eine Funktion definiert PrintHello

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

aber in der Hauptsache hast du einen Tippfehler gemacht und statt PrintHello du hast getippt printHello mit Kleinbuchstaben ‘p’.

#include <cstdio>

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

int main()
{
   printHello();
}

In diesem Fall gibt der Compiler einen solchen Fehler aus, weil er die Namensdeklaration nicht sieht printHello. PrintHello und printHello sind zwei verschiedene Namen, von denen einer deklariert wurde und der andere nicht deklariert, aber im Hauptteil von main verwendet wurde

  • In C++ sind die Versionen ohne std:: funktionieren nicht garantiert

    – MM

    16. März 2016 um 21:31 Uhr

Es ist mir passiert, als der automatische Formatierer in einem Visual Studio-Projekt meine Includes sortierte, wonach der vorkompilierte Header nicht mehr das erste Include war.

Mit anderen Worten. Wenn Sie eines davon haben:

#include "pch.h"

oder

#include <stdio.h>

oder

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

Setzen Sie es an den Anfang Ihrer Datei.

Wenn dein Clang-Formatierer die Dateien automatisch sortiert, versuchen Sie, eine Eingabe nach dem vorkompilierten Header zu setzen. Wenn es eingeschaltet ist IBS_Preserve es wird jeden #include-Block separat sortieren.

#include "pch.h"  // must be first

#include "bar.h"  // next block
#include "baz.h"
#include "foo.h"

Mehr Infos unter
Compilerfehler C2065

  • In C++ sind die Versionen ohne std:: funktionieren nicht garantiert

    – MM

    16. März 2016 um 21:31 Uhr

Ein C++-Bezeichner ist ein Name, der verwendet wird, um eine Variable, eine Funktion, eine Klasse, ein Modul oder ein anderes benutzerdefiniertes Element zu identifizieren. In C++ müssen alle Namen deklariert werden, bevor sie verwendet werden. Wenn Sie versuchen, den Namen eines solchen zu verwenden, der nicht deklariert wurde, erhalten Sie einen “nicht deklarierten Bezeichner”-Kompilierungsfehler.

Entsprechend der Dokumentationdie Erklärung von printf() ist in cstdio dh Sie müssen es einbinden, bevor Sie die Funktion verwenden.

989160cookie-checkWas ist ein „nicht deklarierter Bezeichner“-Fehler und wie behebe ich ihn?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy