Megosztás a következőn keresztül:


C2065-ös fordítási hiba

"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;
};