Compiler Error C2065

'pengidentifikasi' : pengidentifikasi yang tidak dinyatakan

Komentar

Pengkompilasi tidak dapat menemukan deklarasi untuk pengidentifikasi. Ada banyak kemungkinan penyebab kesalahan ini. Penyebab paling umum C2065 adalah bahwa pengidentifikasi belum dinyatakan, pengidentifikasi salah eja, header tempat pengidentifikasi dinyatakan tidak disertakan dalam file, atau pengidentifikasi kehilangan kualifikasi cakupan, misalnya, cout alih-alih std::cout. Untuk informasi selengkapnya tentang deklarasi di C++, lihat Deklarasi dan Definisi (C++).

Berikut adalah beberapa masalah umum dan solusi secara lebih rinci.

Pengidentifikasi tidak dinyatakan

Jika pengidentifikasi adalah variabel atau nama fungsi, Anda harus mendeklarasikannya sebelum dapat digunakan. Deklarasi fungsi juga harus menyertakan jenis parameternya sebelum fungsi dapat digunakan. Jika variabel dinyatakan menggunakan auto, pengkompilasi harus dapat menyimpulkan jenis dari penginisialisasinya.

Jika pengidentifikasi adalah anggota kelas atau struktur, atau dideklarasikan dalam namespace, pengidentifikasi harus memenuhi syarat oleh kelas atau nama struct, atau nama namespace, saat digunakan di luar cakupan struct, kelas, atau namespace layanan. Atau, namespace harus dibawa ke dalam cakupan oleh using arahan seperti using namespace std;, atau nama anggota harus dibawa ke dalam cakupan oleh using deklarasi, seperti using std::string;. Jika tidak, nama yang tidak memenuhi syarat dianggap sebagai pengidentifikasi yang tidak dinyatakan dalam cakupan saat ini.

Jika pengidentifikasi adalah tag untuk jenis yang ditentukan pengguna, misalnya, atau classstruct, jenis tag harus dideklarasikan sebelum dapat digunakan. Misalnya, deklarasi struct SomeStruct { /*...*/ }; harus ada sebelum Anda dapat mendeklarasikan variabel SomeStruct myStruct; dalam kode Anda.

Jika pengidentifikasi adalah alias jenis, jenis harus dideklarasikan oleh using deklarasi atau typedef sebelum dapat digunakan. Misalnya, Anda harus mendeklarasikan using my_flags = std::ios_base::fmtflags; sebelum dapat menggunakan my_flags sebagai alias jenis untuk std::ios_base::fmtflags.

Contoh: pengidentifikasi salah eja

Kesalahan ini biasanya terjadi ketika nama pengidentifikasi salah eja, atau pengidentifikasi menggunakan huruf besar dan huruf kecil yang salah. Nama dalam deklarasi harus sama persis dengan nama yang Anda gunakan.

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

Contoh: gunakan pengidentifikasi yang tidak terlingkup

Kesalahan ini dapat terjadi jika pengidentifikasi Anda tidak terlingkup dengan benar. Jika Anda melihat C2065 saat menggunakan cout, masalah cakupan adalah penyebabnya. Ketika fungsi dan operator Pustaka Standar C++ tidak sepenuhnya memenuhi syarat oleh namespace, atau Anda belum membawa std namespace ke dalam cakupan saat ini dengan menggunakan using direktif, pengkompilasi tidak dapat menemukannya. Untuk memperbaiki masalah ini, Anda harus sepenuhnya memenuhi syarat nama pengidentifikasi, atau menentukan namespace dengan direktif using .

Contoh ini gagal dikompilasi karena cout dan endl didefinisikan dalam std namespace:

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

Pengidentifikasi yang dinyatakan di dalam class, , structatau enum class jenis juga harus memenuhi syarat dengan nama cakupan penutupnya saat Anda menggunakannya di luar cakupan tersebut.

Contoh: header yang telah dikompresi bukan yang pertama

Kesalahan ini dapat terjadi jika Anda meletakkan direktif prapemroseduran, seperti #include, , #defineatau #pragma, sebelum #include file header yang telah dikommpilasikan sebelumnya. Jika file sumber Anda menggunakan file header yang telah dikompilasi sebelumnya (yaitu, jika dikompilasi dengan menggunakan /Yu opsi pengkompilasi) maka semua arahan praprosem sebelum file header yang telah dikompilasi diabaikan.

Contoh ini gagal dikompilasi karena cout dan endl ditentukan dalam <iostream> header, yang diabaikan karena disertakan sebelum file header yang telah dikompilasi sebelumnya. Untuk membuat contoh ini, buat ketiga file, lalu kompilasi pch.h (beberapa versi penggunaan stdafx.cppVisual Studio ), lalu kompilasi C2065_pch.cpp.

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

File pch.h sumber atau stdafx.h :

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

File sumber 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
}

Untuk memperbaiki masalah ini, tambahkan #include <iostream> ke dalam file header yang telah dikommpilasikan sebelumnya, atau pindahkan setelah file header yang telah dikompresi disertakan dalam file sumber Anda.

Contoh: file header hilang

Kesalahan dapat terjadi jika Anda belum menyertakan file header yang mendeklarasikan pengidentifikasi. Pastikan file yang berisi deklarasi untuk pengidentifikasi disertakan dalam setiap file sumber yang menggunakannya.

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

Kemungkinan penyebab lain adalah jika Anda menggunakan daftar inisialisasi tanpa menyertakan <header 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
}

Anda mungkin melihat kesalahan ini di file sumber aplikasi Windows Desktop jika Anda menentukan VC_EXTRALEAN, , WIN32_LEAN_AND_MEANatau WIN32_EXTRA_LEAN. Makro praprosesor ini mengecualikan beberapa file header dari windows.h dan afxv_w32.h untuk mempercepat kompilasi. Cari dan windows.hafxv_w32.h untuk deskripsi terbaru tentang apa yang dikecualikan.

Contoh: tidak ada kutipan penutupan

Kesalahan ini dapat terjadi jika Anda kehilangan kutipan penutup setelah konstanta string. Ini adalah cara mudah untuk membingungkan pengkompilasi. Kutipan penutup yang hilang mungkin beberapa baris sebelum lokasi kesalahan yang dilaporkan.

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

Contoh: gunakan iterator di luar untuk cakupan perulangan

Kesalahan ini dapat terjadi jika Anda mendeklarasikan variabel iterator dalam perulangan for , dan kemudian Anda mencoba menggunakan variabel iterator tersebut di luar cakupan for perulangan. Pengkompilasi mengaktifkan /Zc:forScope opsi pengkompilasi secara default. Untuk informasi selengkapnya, lihat Men-debug dukungan iterator.

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

Contoh: deklarasi prapemroseksi dihapus

Kesalahan ini dapat terjadi jika Anda merujuk ke fungsi atau variabel yang berada dalam kode yang dikompilasi secara kondisional yang tidak dikompilasi untuk konfigurasi Anda saat ini. Kesalahan juga dapat terjadi jika Anda memanggil fungsi dalam file header yang saat ini tidak didukung di lingkungan build Anda. Jika variabel atau fungsi tertentu hanya tersedia ketika makro praprosesor tertentu ditentukan, pastikan kode yang memanggil fungsi tersebut hanya dapat dikompilasi ketika makro praprosesor yang sama ditentukan. Masalah ini mudah ditemukan dalam IDE: Deklarasi untuk fungsi berwarna abu-abu jika makro praprosesor yang diperlukan tidak ditentukan untuk konfigurasi build saat ini.

Berikut adalah contoh kode yang berfungsi saat Anda membuat di Debug, tetapi bukan Rilis:

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

Contoh: Kegagalan pengurangan jenis C++/CLI

Kesalahan ini dapat terjadi saat memanggil fungsi generik, jika argumen jenis yang dimaksudkan tidak dapat disimpulkan dari parameter yang digunakan. Untuk informasi selengkapnya, lihat Fungsi Generik (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
}

Contoh: Parameter atribut C++/CLI

Kesalahan ini juga dapat dihasilkan sebagai akibat dari pekerjaan kesesuaian kompilator yang dilakukan untuk Visual Studio 2005: pemeriksaan parameter untuk atribut 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;
};