Share via


Namensergänzung

Namensergänzungen beziehen in der Regel auf C++-Benennungskonventionen, können jedoch auch auf eine Vielzahl von C-Fällen zutreffen. Standardmäßig verwendet C++ den Funktionsnamen, Parameter und den Rückgabetyp, um einen Linkernamen für die Funktion zu erstellen. Betrachten Sie die folgende Funktionsdeklaration:

void CALLTYPE test(void);

In der folgenden Tabelle ist der Linkername für verschiedene Aufrufkonventionen dargestellt.

Aufrufkonvention extern "C" oder .c Datei .cpp, .cxx oder /TP
C-Namenskonvention (__cdecl) _test ?test@@ZAXXZ
Schnelle Anrufbenennungskonvention (__fastcall) @test@0 ?test@@YIXXZ
Standardanrufbenennungskonvention (__stdcall) _test@0 ?test@@YGXXZ
Benennungskonvention für Vektoraufrufe (__vectorcall) test@@0 ?test@@YQXXZ

Wird extern "C" verwendet, um eine C-Funktion aus C++ aufzurufen. extern "C" erzwingt die Verwendung der C-Benennungskonvention für Nicht-Klassen-C++-Funktionen. Beachten Sie die Compileroptionen /Tc oder /Tp, die den Compiler anweisen, die Dateinamenerweiterung zu ignorieren und die Datei als C oder C++ zu kompilieren. Diese Optionen können zu Linkernamen führen, die Sie nicht erwarten.

Funktionsprototypen mit nicht übereinstimmenden Parametern können auch zu diesem Fehler führen. Namensergänzungen fügen die Parameter einer Funktion in den endgültigen ergänzten Funktionsnamen ein. Das Aufrufen einer Funktion mit den Parametertypen, die nicht den Parametertypen in der Funktionsdeklaration entsprechen, kann auch LNK2001 verursachen.

Es gibt derzeit keine Standards für die C++-Benennung zwischen Compileranbietern oder sogar zwischen verschiedenen Versionen eines Compilers. Das Verknüpfen von Objektdateien, die von anderen Compilern kompiliert wurden, erzeugt möglicherweise nicht dasselbe Benennungsschema und kann zu nicht aufgelösten externen Objekten führen.

Siehe auch

Linkertoolfehler LNK2001