Partager via


Erreur du compilateur C3861

'identifier' : identificateur introuvable

Le compilateur n’a pas pu résoudre une référence à un identificateur, même à l’aide d’une recherche dépendante de l’argument.

Notes

Pour corriger cette erreur, comparez l’utilisation de l’identificateur à la déclaration d’identificateur pour la casse et l’orthographe. Vérifiez que les opérateurs de résolution d’étendue et les directives d’espace de noms using sont utilisés correctement. Si l’identificateur est déclaré dans un fichier d’en-tête, vérifiez que l’en-tête est inclus avant que l’identificateur soit référencé. Si l’identificateur est destiné à être visible en externe, assurez-vous qu’il est déclaré dans un fichier source qui l’utilise. Vérifiez également que la déclaration ou la définition de l’identificateur n’est pas exclue par les directives de compilation conditionnelle.

Les modifications apportées à la suppression des fonctions obsolètes de la bibliothèque runtime C dans Visual Studio 2015 peuvent entraîner L’erreur C3861. Pour résoudre cette erreur, supprimez les références à ces fonctions ou remplacez-les par leurs alternatives sécurisées, le cas échéant. Pour plus d’informations, consultez Fonctions obsolètes.

Si l’erreur C3861 s’affiche après la migration du projet à partir d’anciennes versions du compilateur, vous pouvez rencontrer des problèmes liés aux versions de Windows prises en charge. Visual C++ ne prend plus en charge le ciblage de Windows 95, Windows 98, Windows ME, Windows NT ou Windows 2000. Si vos WINVER _WIN32_WINNT macros sont affectées à l’une de ces versions de Windows, vous devez modifier les macros. Pour plus d’informations, consultez Modification WINVER et _WIN32_WINNT.

Exemples

Identificateur non défini

L’exemple suivant génère l’erreur C3861, car l’identificateur n’est pas défini.

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

Identificateur non inclus dans l’étendue

L’exemple suivant génère l’erreur C3861, car un identificateur est visible uniquement dans l’étendue de fichier de sa définition, sauf s’il est déclaré dans d’autres fichiers sources qui l’utilisent.

Fichier source 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
}

Fichier source C3861_a2.cpp :

// C3861_a2.cpp
int f() {  // declared and defined here
   return 42;
}

Qualification de l’espace de noms requise

Les classes d’exception de la bibliothèque standard C++ nécessitent l’espace std de noms.

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

Fonction obsolète appelée

Les fonctions obsolètes ont été supprimées de la bibliothèque 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 );
}

Fonctions ADL et friend

L’exemple suivant génère l’erreur C3767, car le compilateur ne peut pas utiliser la recherche dépendante de l’argument pour 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
}

Pour corriger l’erreur, déclarez l’ami dans l’étendue de classe et définissez-le dans l’étendue de l’espace de noms :

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

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

int main() {
   func();
}