Aracılığıyla paylaş


Derleyici Hatası C2065

'identifier' : bildirilmemiş tanımlayıcı

Derleyici bir tanımlayıcının bildirimini bulamıyor. Bu hatanın birçok olası nedeni vardır. C2065'in en yaygın nedenleri, tanımlayıcının bildirilmemiş olması, tanımlayıcının yanlış yazılmış olması, tanımlayıcının bildirildiği üst bilginin dosyaya dahil olmaması veya tanımlayıcının örneğin yerine bir kapsam niteleyicisinin cout std::couteksik olmasıdır. C++ içindeki bildirimler hakkında daha fazla bilgi için bkz . Bildirimler ve Tanımlar (C++).

Burada daha ayrıntılı olarak bazı yaygın sorunlar ve çözümler yer alır.

Tanımlayıcı bildirilmemiş

Tanımlayıcı bir değişken veya işlev adıysa, kullanılabilmesi için önce bunu bildirmeniz gerekir. İşlev bildirimi, işlevin kullanılabilmesi için önce parametrelerinin türlerini de içermelidir. değişkeni kullanılarak autobildirilirse, derleyicinin türünü başlatıcısından çıkarabilmesi gerekir.

Tanımlayıcı bir sınıfın veya yapının üyesiyse veya bir ad alanında bildirilirse, yapı, sınıf veya ad alanı kapsamı dışında kullanıldığında sınıf veya yapı adı ya da ad alanı adı ile nitelenmelidir. Alternatif olarak, ad alanı gibi using namespace std;bir using yönerge tarafından kapsama alınmalıdır veya üye adı gibi using std::string;bir using bildirimle kapsama alınmalıdır. Aksi takdirde, nitelenmemiş ad geçerli kapsamda bildirilmemiş bir tanımlayıcı olarak kabul edilir.

Tanımlayıcı, veya gibi kullanıcı tanımlı bir türün etiketiyse, class structkullanılabilmesi için önce etiketin türü bildirilmelidir. Örneğin, struct SomeStruct { /*...*/ }; kodunuzda bir değişken SomeStruct myStruct; bildirebilmeniz için bildirim mevcut olmalıdır.

Tanımlayıcı bir tür diğer adıysa, türün bir using bildirim tarafından veya typedef kullanılabilmesi için önce bildirilmesi gerekir. Örneğin, için bir tür diğer adı olarak kullanabilmek my_flags için std::ios_base::fmtflagsönce bildirmeniz using my_flags = std::ios_base::fmtflags; gerekir.

Örnek: yanlış yazılmış tanımlayıcı

Bu hata genellikle tanımlayıcı adı yanlış yazıldığında veya tanımlayıcı yanlış büyük ve küçük harfleri kullandığında oluşur. Bildirimdeki ad, kullandığınız adla tam olarak eşleşmelidir.

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

Örnek: kapsamsız tanımlayıcı kullanma

Tanımlayıcınızın kapsamı düzgün şekilde belirlenmiş değilse bu hata oluşabilir. kullanırken coutC2065 görüyorsanız, bunun nedeni kapsam sorunudur. C++ Standart Kitaplığı işlevleri ve işleçleri ad alanı tarafından tam olarak nitelenmemişse veya bir using yönerge kullanarak ad alanını geçerli kapsama getirmediysenizstd, derleyici bunları bulamaz. Bu sorunu düzeltmek için tanımlayıcı adlarını tam olarak nitelemeli veya yönergesiyle using ad alanını belirtmelisiniz.

Ad alanında tanımlandığından ve endl tanımlandığından std bu örnek derlenemiyorcout:

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

, structveya enum class türlerinin classiçinde bildirilen tanımlayıcılar, bu kapsamın dışında kullandığınızda, bunların kapsayan kapsam adıyla da nitelenmelidir.

Örnek: önceden derlenmiş üst bilgi ilk değil

Bu hata, , #defineveya #pragmagibi #includeön işlemci yönergelerini önceden derlenmiş üst bilgi dosyasının #include önüne koyarsanız oluşabilir. Kaynak dosyanız önceden derlenmiş bir üst bilgi dosyası kullanıyorsa (derleyici seçeneği kullanılarak /Yu derlenmişse), önceden derlenmiş üst bilgi dosyasından önceki tüm önişlemci yönergeleri yoksayılır.

Önceden derlenmiş üst bilgi dosyasından önce eklendiğinden <iostream> yoksayılan ve endl üst bilgide tanımlandığı için bu örnek derlenemiyorcout. Bu örneği oluşturmak için üç dosyanın tümünü oluşturun, ardından derleyin pch.h (Visual Studio'nun bazı sürümleri kullanılır stdafx.cpp), ardından derleyin C2065_pch.cpp.

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

pch.h veya stdafx.h kaynak dosyası:

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

Kaynak dosya 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
}

Bu sorunu çözmek için #include önceden derlenmiş üst bilgi dosyasına ekleyin <iostream> veya önceden derlenmiş üst bilgi dosyası kaynak dosyanıza eklendikten sonra taşıyın.

Örnek: eksik üst bilgi dosyası

Tanımlayıcıyı bildiren üst bilgi dosyasını dahil etmediyseniz hata oluşabilir. Tanımlayıcının bildirimini içeren dosyanın, onu kullanan her kaynak dosyaya eklendiğinden emin olun.

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

Başka bir olası neden, initializer_list> üst bilgisini eklemeden <bir başlatıcı listesi kullanmanızdır.

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

, WIN32_LEAN_AND_MEANveya WIN32_EXTRA_LEANtanımlarsanız VC_EXTRALEANWindows Masaüstü uygulama kaynak dosyalarında bu hatayı görebilirsiniz. Bu önişlemci makroları, derlemeleri hızlandırmak için ve'den windows.h afxv_w32.h bazı üst bilgi dosyalarını dışlar. windows.h Dahil edilenlerin güncel bir açıklamasını görmek için ve afxv_w32.h bölümüne bakın.

Örnek: eksik kapanış teklifi

Dize sabiti sonrasında kapanış tırnak işareti eksikse bu hata oluşabilir. Derleyicinin kafasını karıştırmanın kolay bir yoludur. Eksik kapanış teklifi, bildirilen hata konumundan önce birkaç satır olabilir.

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

Örnek: döngü kapsamı için yineleyiciyi dışarıda kullanın

Döngüde for bir yineleyici değişkeni bildirirseniz ve ardından bu yineleyici değişkenini döngü kapsamı for dışında kullanmayı denerseniz bu hata oluşabilir. Derleyici, derleyici seçeneğini varsayılan olarak etkinleştirir /Zc:forScope . Daha fazla bilgi için bkz . Yineleyici desteğinde hata ayıklama.

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

Örnek: önişlemci kaldırıldı bildirimi

Geçerli yapılandırmanız için derlenmemiş koşullu olarak derlenmiş kodda yer alan bir işleve veya değişkene başvurursanız bu hata oluşabilir. Derleme ortamınızda şu anda desteklenmeyen bir üst bilgi dosyasındaki bir işlevi çağırırsanız da hata oluşabilir. Belirli değişkenler veya işlevler yalnızca belirli bir önişlemci makro tanımlandığında kullanılabiliyorsa, bu işlevleri çağıran kodun yalnızca aynı önişlemci makro tanımlandığında derlendiğinden emin olun. Bu sorunu IDE'de kolayca tespit edebilirsiniz: Gerekli önişlemci makroları geçerli derleme yapılandırması için tanımlanmamışsa işlev bildirimi gri görünür.

Aşağıda, Hata Ayıklama'da derleme yaparken çalışan ancak Sürüm'de çalışmayan bir kod örneği verilmiştir:

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

Örnek: C++/CLI türü kesinti hatası

Hedeflenen tür bağımsız değişkeni kullanılan parametrelerden çıkarılamıyorsa, genel bir işlev çağrılırken bu hata oluşabilir. Daha fazla bilgi için bkz . Genel İşlevler (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
}

Örnek: C++/CLI öznitelik parametreleri

Bu hata, Visual Studio 2005 için yapılan derleyici uyumluluğu çalışmasının sonucu olarak da oluşturulabilir: Visual C++ öznitelikleri için parametre denetimi.

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