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 auto
deklariert 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 cout
C2065 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
, struct
oder 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. , #define
oder #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.cpp
dann .
// 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_MEAN
oder WIN32_EXTRA_LEAN
. Diese Präprozessormakros schließen einige Headerdateien aus windows.h
und afxv_w32.h
beschleunigen Kompilierungen. Suchen Sie nach windows.h
afxv_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;
};