Partilhar via


Erro do compilador C3861

'identificador': identificador não encontrado

Observações

O compilador não conseguiu resolver uma referência a um identificador, mesmo usando pesquisa dependente de argumento.

Para corrigir este erro, compare o uso do identificador com a declaração do identificador em termos de maiúsculas, minúsculas e ortografia. Verifique se os operadores de resolução de escopo e as diretivas de namespaceusing são usados corretamente. Se o identificador for declarado em um arquivo de cabeçalho, verifique se o cabeçalho está incluído antes que o identificador seja referenciado. Se o identificador se destinar a ser visível externamente, certifique-se de que está declarado em qualquer ficheiro de origem que o utilize. Verifique também se a declaração ou definição de identificador não está excluída por diretivas de compilação condicional.

Alterações para remover funções obsoletas da Biblioteca de Tempo de Execução em 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 por suas alternativas seguras, se houver. Para obter mais informações, consulte Funções obsoletas.

Se o erro C3861 aparecer após a migração do projeto de versões mais antigas do compilador, você pode ter problemas relacionados às versões suportadas do Windows. Visual C++ não suporta mais direcionamento para Windows 95, Windows 98, Windows ME, Windows NT ou Windows 2000. Se as macros WINVER ou _WIN32_WINNT estiverem atribuídas a uma destas versões do Windows, tem de modificar as macros. Para obter mais informações, consulte Modificando WINVER e _WIN32_WINNT.

Exemplos

Identificador indefinido

O exemplo a seguir gera C3861 porque o identificador não está definido.

// C3861.cpp
void f2(){}
int main() {
   f();    // C3861
   f2();   // OK
}

Identificador fora de escopo

O exemplo a seguir gera C3861, porque um identificador só é visível no escopo do arquivo de sua definição, a menos que seja declarado em outros arquivos de origem que o usam.

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

Ficheiro 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 do C++ exigem o std namespace.

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

Funções obsoletas foram removidas da biblioteca 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 funções amigas

O exemplo a seguir gera C3861 porque o compilador não pode usar 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 o amigo no escopo da classe e defina-o no escopo do namespace:

class MyClass {
   int m_private;
   friend void func();
};

void func() {
   MyClass s;
   s.m_private = 0;
}

int main() {
   func();
}