Compilerfehler C3861
„identifier“: Bezeichner nicht gefunden
Der Compiler konnte einen Verweis auf einen Bezeichner nicht auflösen, auch wenn argumentabhängige Suche verwendet wird.
Hinweise
Um diesen Fehler zu beheben, vergleichen Sie die Verwendung des Bezeichners mit der Bezeichnerdeklaration für Groß- und Kleinschreibung. Überprüfen Sie, ob Bereichsauflösungsoperatoren und Namespacedirektiven using
ordnungsgemäß verwendet werden. Wenn der Bezeichner in einer Headerdatei deklariert wird, überprüfen Sie, ob der Header enthalten ist, bevor auf den Bezeichner verwiesen wird. Wenn der Bezeichner extern sichtbar sein soll, stellen Sie sicher, dass er in jeder Quelldatei deklariert ist, die ihn verwendet. Überprüfen Sie außerdem, ob die Id-Deklaration oder -definition nicht durch bedingte Kompilierungsdirektiven ausgeschlossen ist.
Änderungen zum Entfernen veralteter Funktionen aus der C-Runtime-Bibliothek in Visual Studio 2015 können zu C3861 führen. Um diesen Fehler zu beheben, entfernen Sie Verweise auf diese Funktionen, oder ersetzen Sie sie durch ihre sicheren Alternativen, falls vorhanden. Weitere Informationen finden Sie unter Veraltete Funktionen.
Wenn der Fehler C3861 nach der Projektmigration von älteren Versionen des Compilers angezeigt wird, treten möglicherweise Probleme im Zusammenhang mit unterstützten Windows-Versionen auf. Visual C++ unterstützt nicht mehr die Zielversionen Windows 95, Windows 98, Windows ME, Windows NT oder Windows 2000. Wenn Ihre WINVER
Makros _WIN32_WINNT
einer dieser Windows-Versionen zugewiesen sind, müssen Sie die Makros ändern. Weitere Informationen finden Sie unter Ändern und Ändern WINVER
von _WIN32_WINNT
.
Beispiele
Nicht definierter Bezeichner
Im folgenden Beispiel wird C3861 generiert, da der Bezeichner nicht definiert ist.
// C3861.cpp
void f2(){}
int main() {
f(); // C3861
f2(); // OK
}
Bezeichner nicht im Bereich
Im folgenden Beispiel wird C3861 generiert, da ein Bezeichner nur im Dateibereich seiner Definition sichtbar ist, es sei denn, er wird in anderen Quelldateien deklariert, die ihn verwenden.
Quelldatei 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
}
Quelldatei C3861_a2.cpp
:
// C3861_a2.cpp
int f() { // declared and defined here
return 42;
}
Namespacequalifizierung erforderlich
Ausnahmeklassen in der C++-Standardbibliothek erfordern den 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;
}
}
Veraltete Funktion aufgerufen
Veraltete Funktionen wurden aus der CRT-Bibliothek entfernt.
// 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 );
}
ADL- und Freundfunktionen
Im folgenden Beispiel wird C3767 generiert, da der Compiler die argumentabhängige Suche nicht für FriendFunc
Folgendes verwenden kann:
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
}
Um den Fehler zu beheben, deklarieren Sie den Freund im Klassenbereich, und definieren Sie ihn im Namespacebereich:
class MyClass {
int m_private;
friend void func();
};
void func() {
MyClass s;
s.m_private = 0;
}
int main() {
func();
}