Partilhar via


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();
}