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::cout
eksik 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 auto
bildirilirse, 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
struct
kullanı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 cout
C2065 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;
}
, struct
veya enum class
türlerinin class
iç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, , #define
veya #pragma
gibi #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_MEAN
veya WIN32_EXTRA_LEAN
tanımlarsanız VC_EXTRALEAN
Windows 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;
};