Share via


Versierde namen

Functies, gegevens en objecten in C- en C++-programma's worden intern vertegenwoordigd door hun versierde namen. Een versierde naam is een gecodeerde tekenreeks die door de compiler is gemaakt tijdens het compileren van een object, gegevens of functiedefinitie. Het registreert aanroepende conventies, typen, functieparameters en andere informatie samen met de naam. Deze naamdecoratie, ook wel naammangling genoemd, helpt de linker bij het vinden van de juiste functies en objecten bij het koppelen van een uitvoerbaar bestand.

De versierde naamconventies zijn gewijzigd in verschillende versies van Visual Studio en kunnen ook verschillen in verschillende doelarchitecturen. Als u correct wilt koppelen aan bronbestanden die zijn gemaakt met visual Studio, C en C++ DLL's en bibliotheken, moeten worden gecompileerd met behulp van dezelfde compilerhulpprogramma's, vlaggen en doelarchitectuur.

Opmerking

Bibliotheken die zijn gebouwd door Visual Studio 2015 of hoger, kunnen worden gebruikt door toepassingen die zijn gebouwd met latere versies van Visual Studio via Visual Studio 2022. Zie binaire compatibiliteit van C++ tussen Visual Studio-versies voor meer informatie.

Versierde namen gebruiken

Normaal gesproken hoeft u de versierde naam niet te kennen om code te schrijven waarmee code wordt gecompileerd en koppelingen worden gecompileerd. Versierde namen zijn een implementatiedetail intern voor de compiler en linker. De hulpprogramma's kunnen meestal de naam in de niet-geconcondeerde vorm verwerken. Een versierde naam is echter soms vereist wanneer u een functienaam opgeeft aan de linker en andere hulpmiddelen. Als u bijvoorbeeld wilt overeenkomen met overbelaste C++-functies, leden van naamruimten, klasseconstructors, destructors en speciale lidfuncties, moet u de versierde naam opgeven. Zie de documentatie voor de hulpprogramma's en opties die u gebruikt voor meer informatie over de optievlagmen en andere situaties waarvoor versierde namen zijn vereist.

Als u de naam van de functie, klasse, aanroepconventie, retourtype of een parameter wijzigt, wordt de versieringsnaam ook gewijzigd. In dit geval moet u de nieuwe versieringsnaam krijgen en overal gebruiken waar de versierde naam is opgegeven.

Naamdecoratie is ook belangrijk bij het koppelen van code die is geschreven in andere programmeertalen of het gebruik van andere compilers. Verschillende compilers gebruiken verschillende naamdecoratieconventies. Wanneer uw uitvoerbare koppelingen naar code die in een andere taal zijn geschreven, moet er speciale aandacht worden besteed aan de geëxporteerde en geïmporteerde namen en aanroepende conventies. Code voor assemblytaal moet gebruikmaken van de met MSVC versierde namen en aanroepende conventies om een koppeling te maken naar broncode die is geschreven met BEHULP van MSVC.

Indeling van een C++-versieringsnaam

Een versierde naam voor een C++-functie bevat de volgende informatie:

  • De naam van de functie.

  • De klasse waarvan de functie lid is, als het een lidfunctie is. De decoratie kan de klasse bevatten die de klasse bevat die de functie bevat, enzovoort.

  • De naamruimte waartoe de functie behoort, als deze deel uitmaakt van een naamruimte.

  • De typen functieparameters.

  • De oproepconventie.

  • Het retourtype van de functie.

  • Een optioneel doelspecifiek element. In ARM64EC objecten wordt een $$h tag ingevoegd in de naam.

De functie- en klassenamen worden gecodeerd in de versierde naam. De rest van de versierde naam is een code die alleen interne betekenis heeft voor de compiler en de linker. Hier volgen enkele voorbeelden van niet-geconconseerde en versierde C++-namen.

Naam ongedaan gemaakt Versierde naam
int a(char){int i=3;return i;}; ?a@@YAHD@Z
void __stdcall b::c(float){}; ?c@b@@AAGXM@Z

Indeling van een C-versieringsnaam

De vorm van decoratie voor een C-functie is afhankelijk van de aanroepconventie die in de declaratie wordt gebruikt, zoals wordt weergegeven in de volgende tabel. Het is ook de decoratie-indeling die wordt gebruikt wanneer C++-code wordt gedeclareerd voor extern "C" koppeling. De standaardconventie voor bellen is __cdecl. In een 64-bits omgeving zijn C of extern "C" functies alleen ingericht wanneer u de __vectorcall oproepconventie gebruikt.

Oproepconventie Decoratie
__cdecl Voorlooponderstrepingsteken (_)
__stdcall Voorlooponderstrepingsteken (_) en een volgteken (@) gevolgd door het aantal bytes in de parameterlijst in decimale komma
__fastcall Voorloop- en volgtekens (@) gevolgd door een decimaal getal dat het aantal bytes in de parameterlijst aangeeft
__vectorcall Twee volgtekens (@@) gevolgd door een decimaal aantal bytes in de parameterlijst
__preserve_none Twee volgtekens, een onderstrepingsteken en het teken A (@@_A)

Voor ARM64EC functies met C linkage (gecompileerd als C of met behulp van extern "C"), wordt een # voorgeprependeerd aan de versierde naam.

Versierde namen weergeven

U kunt de versierde vorm van een symboolnaam ophalen nadat u het bronbestand hebt gecompileerd dat de gegevens, het object of de functiedefinitie of het prototype bevat. Als u de versierde namen in uw programma wilt onderzoeken, kunt u een van de volgende methoden gebruiken:

Een vermelding gebruiken om versierde namen weer te geven

  1. Genereer een vermelding door het bronbestand te compileren dat de gegevens, het object of de functiedefinitie of het prototype bevat met de /FA compileroptie (Bestandstype weergeven) die is ingesteld op assembly met broncode (/FAs).

    Voer bijvoorbeeld in cl /c /FAs example.cpp bij een opdrachtprompt voor ontwikkelaars om een vermeldingsbestand te genereren. example.asm

  2. Zoek in het resulterende lijstbestand de regel die begint met PUBLIC en eindigt een puntkomma (;) gevolgd door de niet-berekende gegevens of functienaam. Het symbool tussen PUBLIC en de puntkomma is de versierde naam.

DumpBIN gebruiken om versierde namen weer te geven

  1. Als u de geëxporteerde symbolen in een OBJ- of LIB-bestand wilt zien, voert u dit in dumpbin /exports <obj-or-lib-file> bij een opdrachtprompt voor ontwikkelaars.

  2. Als u de versierde vorm van een symbool wilt vinden, zoekt u de ongeconcondeerde naam tussen haakjes. De versierde naam bevindt zich op dezelfde regel, vóór de ongeconcondeerde naam.

Niet-geclassificeerde namen weergeven

U kunt undname.exe gebruiken om een versierde naam te converteren naar het niet-geconconseerde formulier. In dit voorbeeld ziet u hoe het werkt:

C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"

Zie ook

Aanvullende MSVC-buildhulpprogramma's
Koppelen extern opgeven