Sdílet prostřednictvím


Chyba kompilátoru C2065

'identifier' : nedelarovaný identifikátor

Kompilátor nemůže najít deklaraci identifikátoru. Existuje mnoho možných příčin této chyby. Nejběžnější příčiny C2065 jsou, že identifikátor nebyl deklarován, identifikátor je chybně zadán, hlavička, kde je identifikátor deklarován, není součástí souboru nebo identifikátor chybí kvalifikátor oboru, cout například místo std::cout. Další informace o deklaracích v jazyce C++ najdete v tématu Deklarace a definice (C++).

Tady jsou některé běžné problémy a řešení podrobněji.

Identifikátor je nelarován.

Pokud je identifikátor proměnnou nebo názvem funkce, musíte ho před jeho použití deklarovat. Deklarace funkce musí také obsahovat typy jeho parametrů, aby bylo možné funkci použít. Pokud je proměnná deklarována pomocí auto, kompilátor musí být schopen odvodit typ z inicializátoru.

Pokud je identifikátor členem třídy nebo struktury nebo deklarován v oboru názvů, musí být kvalifikovaný názvem třídy nebo struktury nebo názvem oboru názvů, pokud se používá mimo strukturu, třídu nebo obor názvů. Případně musí být obor názvů uveden do oboru působnosti direktivou using , jako using namespace std;je například , nebo název člena musí být přenesen do oboru using deklarací, například using std::string;. Jinak se nekvalifikovaný název považuje za nedelarovaný identifikátor v aktuálním oboru.

Pokud je identifikátor značkou pro uživatelem definovaný typ, například nebo classstruct, musí být typ značky deklarován, aby bylo možné jej použít. Před deklarací proměnné SomeStruct myStruct; v kódu musí například existovat deklaracestruct SomeStruct { /*...*/ };.

Pokud je identifikátor aliasem typu, musí být typ deklarován deklarací using nebo typedef před použitím. Musíte například deklarovat using my_flags = std::ios_base::fmtflags; před použitím my_flags jako alias typu pro std::ios_base::fmtflags.

Příklad: chybně napsaný identifikátor

K této chybě obvykle dochází, když je název identifikátoru nesprávně napsaný nebo identifikátor používá nesprávné velká a malá písmena. Název v deklaraci se musí přesně shodovat s názvem, který používáte.

// 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říklad: Použití neskopovaného identifikátoru

K této chybě může dojít v případě, že váš identifikátor není správně vymezený. Pokud se při použití coutzobrazí C2065, je příčinou problém s rozsahem. Pokud funkce a operátory standardní knihovny C++ nejsou plně kvalifikované oborem názvů nebo jste obor názvů nepřevedli std do aktuálního oboru pomocí direktivy using , kompilátor je nemůže najít. Pokud chcete tento problém vyřešit, musíte buď plně kvalifikovat názvy identifikátorů, nebo zadat obor názvů s direktivou using .

Tento příklad se nepodaří zkompilovat, protože cout jsou endl definovány v std oboru názvů:

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

Identifikátory, které jsou deklarovány uvnitř class, structnebo enum class typy musí být také kvalifikované názvem jejich nadřazeného oboru, pokud je použijete mimo tento obor.

Příklad: Předkompilovaná hlavička není první

K této chybě může dojít, pokud před předkompilovaný hlavičkový soubor vložíte jakékoli direktivy preprocesoru, například #include, #definenebo #pragma.#include Pokud zdrojový soubor používá předkompilovaný hlavičkový soubor (tj. pokud je zkompilován pomocí možnosti kompilátoru /Yu ), budou všechny direktivy preprocesoru před předkompilovaným hlavičkovým souborem ignorovány.

Tento příklad se nepovede zkompilovat, protože coutendl je definován v <iostream> hlavičce, která je ignorována, protože je součástí předkompilovaného souboru hlaviček. Chcete-li sestavit tento příklad, vytvořte všechny tři soubory a pak zkompilujte pch.h (některé verze sady Visual Studio používají stdafx.cpp), pak zkompilujte C2065_pch.cpp.

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

stdafx.h Zdrojový pch.h soubor:

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

Zdrojový soubor 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
}

Pokud chcete tento problém vyřešit, přidejte do předkompilovaného souboru hlaviček #include nebo ho <iostream> přesuňte po zahrnutí předkompilovaného souboru hlaviček do zdrojového souboru.

Příklad: Chybějící soubor záhlaví

K chybě může dojít, pokud jste nezahrnuli hlavičkový soubor, který deklaruje identifikátor. Ujistěte se, že soubor, který obsahuje deklaraci identifikátoru, je součástí každého zdrojového souboru, který ho používá.

// 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
}

Další možnou příčinou je, že použijete seznam inicializátorů bez zahrnutí hlavičky <initializer_list> .

// 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
}

Tato chyba se může zobrazit ve zdrojových souborech desktopové aplikace pro Windows, pokud definujete VC_EXTRALEAN, WIN32_LEAN_AND_MEANnebo WIN32_EXTRA_LEAN. Tato makra preprocesoru vyloučí některé soubory hlaviček a windows.hafxv_w32.h zkompiluje je. windows.h Vyhledejte aktuální afxv_w32.h popis toho, co je vyloučeno.

Příklad: Chybějící uzavírací uvozovka

K této chybě může dojít v případě, že za řetězcovou konstantou chybí uzavírací uvozovka. Je to snadný způsob, jak kompilátor zmást. Chybějící uzavírací uvozovka může být několik řádků před nahlášenou chybovou polohou.

// 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říklad: Použití iterátoru mimo obor smyčky

K této chybě může dojít, pokud deklarujete proměnnou iterátoru for ve smyčce a pak se pokusíte použít tuto proměnnou iterátoru mimo rozsah smyčky for . Kompilátor ve výchozím nastavení povolí možnost kompilátoru /Zc:forScope . Další informace naleznete v tématu Podpora iterátoru ladění.

// 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říklad: Odebrání deklarace preprocesoru

K této chybě může dojít, pokud odkazujete na funkci nebo proměnnou, která je v podmíněně zkompilovaném kódu, který není zkompilován pro vaši aktuální konfiguraci. K této chybě může dojít také v případě, že voláte funkci v souboru hlaviček, který aktuálně není ve vašem prostředí sestavení podporovaný. Pokud jsou určité proměnné nebo funkce k dispozici pouze v případě, že je definováno konkrétní makro preprocesoru, ujistěte se, že kód, který tyto funkce volá, je možné zkompilovat pouze v případě, že je definováno stejné makro preprocesoru. Tento problém je v integrovaném vývojovém prostředí snadno rozpoznatelný: Deklarace funkce se zobrazí šedě, pokud pro aktuální konfiguraci sestavení nejsou definovaná požadovaná makra preprocesoru.

Tady je příklad kódu, který funguje při sestavování v ladění, ale ne 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
}

Příklad: Selhání odpočtu typu C++/CLI

K této chybě může dojít při volání obecné funkce, pokud zamýšlený argument typu nelze odvodit z použitých parametrů. Další informace najdete v tématu Obecné funkce (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říklad: Parametry atributu C++/CLI

Tuto chybu lze také vygenerovat v důsledku práce kompilátoru, která byla provedena pro Visual Studio 2005: kontrola parametrů pro atributy Visual C++.

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