Compilerfehler C2065

"Bezeichner" : Nicht deklarierter Bezeichner

Der Compiler kann die Deklaration für einen Bezeichner nicht finden. Für diesen Fehler gibt es viele mögliche Ursachen. Die häufigsten Ursachen von C2065 sind, dass der Bezeichner nicht deklariert wurde, der Bezeichner falsch geschrieben ist, der Header, in dem der Bezeichner deklariert wird, nicht in der Datei enthalten ist oder der Bezeichner einen Bereichsqualifizierer fehlt, cout z. B. anstelle von std::cout. Weitere Informationen zu Deklarationen in C++ finden Sie unter Deklarationen und Definitionen (C++).

Im Folgenden finden Sie einige häufige Probleme und Lösungen ausführlicher.

Der Bezeichner ist nicht deklariert.

Wenn der Bezeichner eine Variable oder ein Funktionsname ist, müssen Sie ihn deklarieren, bevor er verwendet werden kann. Eine Funktionsdeklaration muss auch die Typen ihrer Parameter enthalten, bevor die Funktion verwendet werden kann. Wenn die Variable mithilfe autodeklariert wird, muss der Compiler den Typ vom Initialisierer ableiten können.

Wenn der Bezeichner ein Mitglied einer Klasse oder Struktur ist oder in einem Namespace deklariert ist, muss er durch den Klassen- oder Strukturnamen oder den Namespacenamen qualifiziert werden, wenn er außerhalb der Struktur, Klasse oder des Namespacebereichs verwendet wird. Alternativ muss der Namespace durch eine using Direktive, z using namespace std;. B. , oder der Membername durch eine using Deklaration in den Gültigkeitsbereich gebracht werden, z using std::string;. B. . Andernfalls gilt der nicht qualifizierte Name als nicht deklarierter Bezeichner im aktuellen Bereich.

Wenn der Bezeichner das Tag für einen benutzerdefinierten Typ ist, z. B. ein class oder struct, muss der Typ des Tags deklariert werden, bevor er verwendet werden kann. Beispielsweise muss die Deklaration struct SomeStruct { /*...*/ }; vorhanden sein, bevor Sie eine Variable SomeStruct myStruct; im Code deklarieren können.

Wenn der Bezeichner ein Typalias ist, muss der Typ durch eine using Deklaration deklariert werden oder typedef bevor er verwendet werden kann. Sie müssen z. B. deklarieren using my_flags = std::ios_base::fmtflags; , bevor Sie my_flags als Typalias für std::ios_base::fmtflags.

Beispiel: Falsch geschriebener Bezeichner

Dieser Fehler tritt häufig auf, wenn der Bezeichnername falsch geschrieben ist oder der Bezeichner die falschen Groß- und Kleinbuchstaben verwendet. Der Name in der Deklaration muss genau mit dem namen übereinstimmen, den Sie verwenden.

// C2065_spell.cpp
// compile with: cl /EHsc C2065_spell.cpp
#include <iostream>
using namespace std;
int main() {
    int someIdentifier = 42;
    cout << "Some Identifier: " << SomeIdentifier << endl;
    // C2065: 'SomeIdentifier': undeclared identifier
    // To fix, correct the spelling:
    // cout << "Some Identifier: " << someIdentifier << endl;
}

Beispiel: Verwenden eines nicht bereichsierten Bezeichners

Dieser Fehler kann auftreten, wenn Der Bezeichner nicht ordnungsgemäß auf den Bereich festgelegt ist. Wenn bei der Verwendung coutC2065 angezeigt wird, ist ein Bereichsproblem die Ursache. Wenn C++-Standardbibliotheksfunktionen und -operatoren nicht vollständig durch Namespace qualifiziert sind oder Sie den std Namespace nicht mithilfe einer using Direktive in den aktuellen Bereich gebracht haben, kann der Compiler sie nicht finden. Um dieses Problem zu beheben, müssen Sie entweder die Bezeichnernamen vollständig qualifizieren oder den Namespace mit der using Direktive angeben.

In diesem Beispiel wird die Kompilierung nicht ausgeführt, da cout sie endl im std Namespace definiert sind:

// C2065_scope.cpp
// compile with: cl /EHsc C2065_scope.cpp
#include <iostream>
// using namespace std;   // Uncomment this line to fix

int main() {
    cout << "Hello" << endl;   // C2065 'cout': undeclared identifier
                               // C2065 'endl': undeclared identifier
    // Or try the following line instead
    std::cout << "Hello" << std::endl;
}

Bezeichner, die innerhalb von class, structoder enum class Typen deklariert sind, müssen auch durch den Namen ihres eingeschlossenen Bereichs qualifiziert werden, wenn Sie sie außerhalb dieses Bereichs verwenden.

Beispiel: Vorkompilierte Kopfzeile ist nicht zuerst

Dieser Fehler kann auftreten, wenn Sie Präprozessordirektiven, z #include. B. , #defineoder #pragma, vor der #include Vorkompilierungsheaderdatei platzieren. Wenn ihre Quelldatei eine vorkompilierte Headerdatei verwendet (d. h., wenn sie mithilfe der /Yu Compileroption kompiliert wird), werden alle Präprozessordirektiven vor dem Ignorieren der vorkompilierten Headerdatei ignoriert.

Dieses Beispiel kann nicht kompiliert werden, da cout sie endl in der <iostream> Kopfzeile definiert ist, die ignoriert wird, da sie vor der vorkompilierten Headerdatei enthalten ist. Erstellen Sie zum Erstellen dieses Beispiels alle drei Dateien, kompilieren pch.h Sie dann (einige Versionen von Visual Studio verwenden stdafx.cpp), und kompilieren Sie C2065_pch.cppdann .

// pch.h (stdafx.h in Visual Studio 2017 and earlier)
#include <stdio.h>

Die pch.h Oder stdafx.h Quelldatei:

// pch.cpp (stdafx.cpp in Visual Studio 2017 and earlier)
// Compile by using: cl /EHsc /W4 /c /Ycstdafx.h stdafx.cpp
#include "pch.h"

Quelldatei C2065_pch.cpp:

// C2065_pch.cpp
// compile with: cl /EHsc /W4 /Yustdafx.h C2065_pch.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;

int main() {
    cout << "Hello" << endl;   // C2065 'cout': undeclared identifier
                               // C2065 'endl': undeclared identifier
}

Um dieses Problem zu beheben, fügen Sie die #include <iostream> der vorkompilierten Headerdatei hinzu, oder verschieben Sie sie, nachdem die vorkompilierte Headerdatei in der Quelldatei enthalten ist.

Beispiel: Fehlende Headerdatei

Der Fehler kann auftreten, wenn Sie die Headerdatei nicht eingeschlossen haben, die den Bezeichner deklariert. Stellen Sie sicher, dass die Datei, die die Deklaration für den Bezeichner enthält, in jeder Quelldatei enthalten ist, die sie verwendet.

// C2065_header.cpp
// compile with: cl /EHsc C2065_header.cpp

//#include <stdio.h>
int main() {
    fpos_t file_position = 42; // C2065: 'fpos_t': undeclared identifier
    // To fix, uncomment the #include <stdio.h> line
    // to include the header where fpos_t is defined
}

Eine weitere mögliche Ursache ist, wenn Sie eine Initialisierungsliste verwenden, ohne die <initializer_list> Kopfzeile einzufügen.

// C2065_initializer.cpp
// compile with: cl /EHsc C2065_initializer.cpp

// #include <initializer_list>
int main() {
    for (auto strList : {"hello", "world"})
        if (strList == "hello") // C2065: 'strList': undeclared identifier
            return 1;
    // To fix, uncomment the #include <initializer_list> line
}

Möglicherweise wird dieser Fehler in Den Quelldateien der Windows Desktop-App angezeigt, wenn Sie definieren VC_EXTRALEAN, WIN32_LEAN_AND_MEANoder WIN32_EXTRA_LEAN. Diese Präprozessormakros schließen einige Headerdateien aus windows.h und afxv_w32.h beschleunigen Kompilierungen. Suchen Sie nach windows.hafxv_w32.h einer aktuellen Beschreibung der ausgeschlossenen Elemente.

Beispiel: Fehlendes schließende Anführungszeichen

Dieser Fehler kann auftreten, wenn nach einer Zeichenfolgenkonstante ein schließende Anführungszeichen fehlt. Es ist eine einfache Möglichkeit, den Compiler zu verwechseln. Das fehlende schließende Anführungszeichen kann mehrere Zeilen vor der gemeldeten Fehlerposition sein.

// C2065_quote.cpp
// compile with: cl /EHsc C2065_quote.cpp
#include <iostream>

int main() {
    // Fix this issue by adding the closing quote to "Aaaa"
    char * first = "Aaaa, * last = "Zeee";
    std::cout << "Name: " << first
        << " " << last << std::endl; // C2065: 'last': undeclared identifier
}

Beispiel: Verwenden des Iterators außerhalb des Schleifenbereichs

Dieser Fehler kann auftreten, wenn Sie eine Iteratorvariable in einer for Schleife deklarieren und dann versuchen, diese Iteratorvariable außerhalb des Bereichs der for Schleife zu verwenden. Der Compiler aktiviert standardmäßig die /Zc:forScope Compileroption. Weitere Informationen finden Sie unter Debug iterator support.

// C2065_iter.cpp
// compile with: cl /EHsc C2065_iter.cpp
#include <iostream>
#include <string>

int main() {
    // char last = '!';
    std::string letters{ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" };
    for (const char& c : letters) {
        if ('Q' == c) {
            std::cout << "Found Q!" << std::endl;
        }
        // last = c;
    }
    std::cout << "Last letter was " << c << std::endl; // C2065
    // Fix by using a variable declared in an outer scope.
    // Uncomment the lines that declare and use 'last' for an example.
    // std::cout << "Last letter was " << last << std::endl; // C2065
}

Beispiel: Vorprozessor entfernte Deklaration

Dieser Fehler kann auftreten, wenn Sie auf eine Funktion oder Variable verweisen, die sich im bedingt kompilierten Code befindet, der für Ihre aktuelle Konfiguration nicht kompiliert ist. Der Fehler kann auch auftreten, wenn Sie eine Funktion in einer Headerdatei aufrufen, die derzeit in Ihrer Buildumgebung nicht unterstützt wird. Wenn bestimmte Variablen oder Funktionen nur verfügbar sind, wenn ein bestimmtes Präprozessormakro definiert ist, stellen Sie sicher, dass der Code, der diese Funktionen aufruft, nur kompiliert werden kann, wenn dasselbe Präprozessormakro definiert ist. Dieses Problem ist einfach in der IDE zu erkennen: Die Deklaration für die Funktion ist abgeblendet, wenn die erforderlichen Präprozessormakros nicht für die aktuelle Buildkonfiguration definiert sind.

Hier ist ein Beispiel für Code, der beim Erstellen in Debug funktioniert, aber nicht release:

// C2065_defined.cpp
// Compile with: cl /EHsc /W4 /MT C2065_defined.cpp
#include <iostream>
#include <crtdbg.h>
#ifdef _DEBUG
    _CrtMemState oldstate;
#endif
int main() {
    _CrtMemDumpStatistics(&oldstate);
    std::cout << "Total count " << oldstate.lTotalCount; // C2065
    // Fix by guarding references the same way as the declaration:
    // #ifdef _DEBUG
    //    std::cout << "Total count " << oldstate.lTotalCount;
    // #endif
}

Beispiel: C++/CLI-Typabzugsfehler

Dieser Fehler kann beim Aufrufen einer generischen Funktion auftreten, wenn das beabsichtigte Typargument nicht von den verwendeten Parametern abgeleitet werden kann. Weitere Informationen finden Sie unter Generic Functions (C++/CLI).For more information, see Generic Functions (C++/CLI).

// C2065_b.cpp
// compile with: cl /clr C2065_b.cpp
generic <typename ItemType>
void G(int i) {}

int main() {
   // global generic function call
   G<T>(10);     // C2065
   G<int>(10);   // OK - fix with a specific type argument
}

Beispiel: C++/CLI-Attributparameter

Dieser Fehler kann auch als Ergebnis der Compilerkonformität generiert werden, die für Visual Studio 2005 ausgeführt wurde: Parameterüberprüfung auf Visual C++-Attribute.

// C2065_attributes.cpp
// compile with: cl /c /clr C2065_attributes.cpp
[module(DLL, name=MyLibrary)];   // C2065
// try the following line instead
// [module(dll, name="MyLibrary")];

[export]
struct MyStruct {
   int i;
};