Erro do compilador C3861
'identifier': identificador não encontrado
O compilador não pôde resolver uma referência a um identificador, mesmo usando a pesquisa dependente de argumento.
Comentários
Para corrigir esse erro, compare o uso do identificador com a declaração do identificador quanto a maiúsculas e minúsculas e a ortografia. Verifique se os operadores de resolução de escopo e as diretivas using
de namespace são usados corretamente. Se o identificador for declarado em um arquivo de cabeçalho, verifique se o cabeçalho é incluído antes que o identificador seja referenciado. Se o identificador for destinado a ser visível externamente, verifique se ele está declarado em todos os arquivos de origem que o usam. Verifique também se a declaração ou definição do identificador não é excluída pelas diretivas de compilação condicional.
Alterações para remover funções obsoletas da Biblioteca de Runtime C no Visual Studio 2015 podem causar o erro C3861. Para resolver esse erro, remova as referências a essas funções ou substitua-as pelas alternativas seguras a elas, se houver. Para obter mais informações, confira Funções obsoletas.
Se o erro C3861 aparecer após a migração de projeto de versões mais antigas do compilador, você poderá ter problemas relacionados a versões compatíveis do Windows. Visual C++ não oferece mais suporte ao direcionamento de Windows 95, Windows 98, Windows ME, Windows NT ou Windows 2000. Se suas macros WINVER
ou _WIN32_WINNT
forem atribuídas a uma dessas versões do Windows, você precisará modificar as macros. Para obter mais informações, confira Modificar WINVER
e _WIN32_WINNT
.
Exemplos
Identificador indefinido
O exemplo a seguir gera o erro C3861 porque o identificador não está definido.
// C3861.cpp
void f2(){}
int main() {
f(); // C3861
f2(); // OK
}
O identificador não está no escopo
O exemplo a seguir gera o erro C3861, pois um identificador só fica visível no escopo do arquivo da definição dele, a menos que seja declarado em outros arquivos de origem que o usam.
Arquivo de origem C3861_a1.cpp
:
// C3861_a1.cpp
// Compile with: cl /EHsc /W4 C3861_a1.cpp C3861_a2.cpp
#include <iostream>
// Uncomment the following line to fix:
// int f(); // declaration makes external function visible
int main() {
std::cout << f() << std::endl; // C3861
}
Arquivo de origem C3861_a2.cpp
:
// C3861_a2.cpp
int f() { // declared and defined here
return 42;
}
Qualificação de namespace necessária
As classes de exceção na Biblioteca Padrão C++ exigem o namespace std
.
// C3861_b.cpp
// compile with: /EHsc
#include <iostream>
int main() {
try {
throw exception("Exception"); // C3861
// try the following line instead
// throw std::exception("Exception");
}
catch (...) {
std::cout << "caught an exception" << std::endl;
}
}
Função obsoleta chamada
Outras funções obsoletas foram removidas da biblioteca do CRT.
// C3861_c.cpp
#include <stdio.h>
int main() {
char line[21]; // room for 20 chars + '\0'
gets( line ); // C3861
// Use gets_s instead.
printf( "The line entered was: %s\n", line );
}
Funções ADL e friend
O exemplo a seguir gera o erro C3767 porque o compilador não pode usar a pesquisa dependente de argumento para FriendFunc
:
namespace N {
class C {
friend void FriendFunc() {}
friend void AnotherFriendFunc(C* c) {}
};
}
int main() {
using namespace N;
FriendFunc(); // C3861 error
C* pC = new C();
AnotherFriendFunc(pC); // found via argument-dependent lookup
}
Para corrigir o erro, declare a função friend no escopo da classe e defina-a no escopo do namespace:
class MyClass {
int m_private;
friend void func();
};
void func() {
MyClass s;
s.m_private = 0;
}
int main() {
func();
}