Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"azonosító" : be nem jelentett azonosító
Megjegyzések
A fordító nem találja az azonosító deklarációját. Ennek a hibának számos oka lehet. A C2065 leggyakoribb oka, hogy az azonosító nem deklarálva van, az azonosító hibás, a fejléc, amelyben az azonosító deklarálva van, nem szerepel a fájlban, vagy az azonosító nem tartalmaz hatókör-minősítőt, cout például nem std::cout. A C++-ban lévő deklarációkról további információt a Deklarációk és definíciók (C++) című témakörben talál.
Íme néhány gyakori probléma és megoldás részletesebben.
Az azonosító nincs bejelentve
Ha az azonosító egy változó vagy egy függvény neve, deklarálnia kell azt a használat előtt. A függvénydeklarációnak tartalmaznia kell a paraméterek típusait is, mielőtt a függvény használható lenne. Ha a változót használva autodeklarálják, a fordítónak képesnek kell lennie arra, hogy a típust az inicializálóból tudja kikövetkeztetni.
Ha az azonosító egy osztály vagy struktúra tagja, vagy egy névtérben deklarálva van, akkor osztály- vagy struktúranévvel vagy névtérnévvel kell minősíteni, ha az a struktúra, az osztály vagy a névtér hatókörén kívül van használva. Másik lehetőségként a névteret egy using olyan irányelvnek kell hatályba helyeznie, mint using namespace std;például a tag neve, vagy a tag nevét egy nyilatkozattal using kell hatályba helyezni, például using std::string;. Ellenkező esetben a nem minősített név az aktuális hatókör be nem jelentett azonosítójának minősül.
Ha az azonosító egy felhasználó által definiált típus címkéje, például egy class vagy struct, a címke típusát deklarálni kell a használat előtt. A deklarációnak struct SomeStruct { /*...*/ }; például léteznie kell, mielőtt deklarálhat egy változót SomeStruct myStruct; a kódban.
Ha az azonosító egy típus aliasa, a típust deklarálni kell egy using deklarációval vagy typedef annak használata előtt. Például deklarálnia using my_flags = std::ios_base::fmtflags; kell, mielőtt típusaliasként használhatja my_flags a következőhöz std::ios_base::fmtflags: .
Példa: hibásan írt azonosító
Ez a hiba általában akkor fordul elő, ha az azonosító neve hibás, vagy ha az azonosító helytelen kis- és nagybetűket használ. A deklarációban szereplő névnek pontosan meg kell egyeznie a használt névvel.
// 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;
}
Példa: nem hivatkozott azonosító használata
Ez a hiba akkor fordulhat elő, ha az azonosító hatóköre nem megfelelő. Ha a C2065-öt használja cout, akkor a hatókörrel kapcsolatos probléma okozza a problémát. Ha a C++ standard kódtár függvényei és operátorai nem rendelkeznek teljes névtér-minősítéssel, vagy a névteret nem hozta std be az aktuális hatókörbe egy using irányelv használatával, a fordító nem találja őket. A probléma megoldásához vagy teljes mértékben minősítenie kell az azonosítóneveket, vagy meg kell adnia a névteret az using irányelvvel.
Ez a példa nem fordítja le, mert coutendl a std névtérben vannak definiálva:
// 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;
}
A hatókörön structenum class kívül classhasznált azonosítóknak és típusoknak a hatókörön kívülre történő használata esetén a hozzájuk tartozó hatókör neve alapján is minősíteni kell őket.
Példa: az előre összeállított fejléc nem az első
Ez a hiba akkor fordulhat elő, ha egy előre összeállított fejlécfájl elé #include helyez előfeldolgozási irányelveket, például #include: , #definevagy #pragma. Ha a forrásfájl előre összeállított fejlécfájlt használ (vagyis ha a fordítás a /Yu fordítóval történik), akkor a program figyelmen kívül hagyja az előre összeállított fejlécfájl előtti összes előfeldolgozási utasítást.
Ez a példa nem fordítható le, mert coutendl az <iostream> a fejlécben van definiálva, és figyelmen kívül hagyja, mert az előre összeállított fejlécfájl elé kerül. A példa létrehozásához hozza létre mindhárom fájlt, majd fordítsa le pch.h (a Visual Studio egyes verzióit), stdafx.cppmajd fordítsa le C2065_pch.cpp.
// pch.h (stdafx.h in Visual Studio 2017 and earlier)
#include <stdio.h>
A pch.h vagy stdafx.h a forrásfájl:
// pch.cpp (stdafx.cpp in Visual Studio 2017 and earlier)
// Compile by using: cl /EHsc /W4 /c /Ycstdafx.h stdafx.cpp
#include "pch.h"
Forrásfájl 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
}
A probléma megoldásához adja hozzá a #include <iostream> az előre összeállított fejlécfájlhoz, vagy helyezze át, miután az előre összeállított fejlécfájl szerepel a forrásfájlban.
Példa: hiányzó fejlécfájl
A hiba akkor fordulhat elő, ha nem tartalmazza az azonosítót deklaráló fejlécfájlt. Győződjön meg arról, hogy az azonosító deklarációját tartalmazó fájl minden azt használó forrásfájlban szerepel.
// 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
}
Egy másik lehetséges ok az, ha inicializáló listát használ a <initializer_list> fejléc nélkül.
// 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
}
Ez a hiba a Windows Desktop alkalmazás forrásfájljaiban jelenhet meg, ha ön definiálja VC_EXTRALEAN, WIN32_LEAN_AND_MEANvagy WIN32_EXTRA_LEAN. Ezek az előfeldolgozó makrók kizárnak néhány fejlécfájlt a windows.h fordítás felgyorsítása érdekében afxv_w32.h . Keresse meg a windows.hafxv_w32.h kizárt elemek up-todátumra vonatkozó leírását.
Példa: hiányzó záró idézőjel
Ez a hiba akkor fordulhat elő, ha egy sztringállandó után hiányzik egy záró idézőjel. Ez egy egyszerű módja annak, hogy összezavarja a fordító. A hiányzó záró idézőjel több sort is tartalmazhat a jelentett hibahely előtt.
// 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
}
Példa: iterátor használata a ciklus hatókörén kívül
Ez a hiba akkor fordulhat elő, ha egy ciklusban for deklarál egy iterátorváltozót, majd ezt az iterátorváltozót a ciklus hatókörén for kívül próbálja használni. A fordító alapértelmezés szerint engedélyezi a /Zc:forScope fordítót. További információ: Hibakeresési iterátor támogatása.
// 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
}
Példa: az előfeldolgozó eltávolított deklarációja
Ez a hiba akkor fordulhat elő, ha olyan függvényre vagy változóra hivatkozik, amely feltételesen lefordított kódban van, és nem az aktuális konfigurációhoz van lefordítva. A hiba akkor is előfordulhat, ha olyan függvényt hív meg egy fejlécfájlban, amely jelenleg nem támogatott a buildkörnyezetben. Ha bizonyos változók vagy függvények csak egy adott előfeldolgozó makró definiálásakor érhetők el, győződjön meg arról, hogy az ezeket a függvényeket meghívó kód csak ugyanazon előfeldolgozó makró definiálásakor állítható össze. Ez a probléma könnyen kivehető az IDE-ben: A függvény deklarációja szürkítve jelenik meg, ha a szükséges előfeldolgozó makrók nincsenek definiálva az aktuális buildkonfigurációhoz.
Íme egy példa olyan kódra, amely a Hibakeresésben való buildeléskor működik, de a Kiadás nem:
// 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
}
Példa: C++/CLI típusú levonási hiba
Ez a hiba általános függvény meghívásakor fordulhat elő, ha a kívánt típusargumentum nem következtethető ki a használt paraméterekből. További információ: 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
}
Példa: C++/CLI attribútumparaméterek
Ez a hiba a Visual Studio 2005-höz készült fordítómegformelési munka eredményeként is létrejön: a Visual C++ attribútumok paraméterellenőrzése.
// 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;
};