Dekorované názvy
Funkce, data a objekty v programech jazyka C a C++ jsou interně reprezentovány jejich zdobenými názvy. Dekorovaný název je kódovaný řetězec vytvořený kompilátorem během kompilace objektu, dat nebo definice funkce. Zaznamenává konvence volání, typy, parametry funkce a další informace společně s názvem. Tato dekorace názvů, označovaná také jako mangling názvu, pomáhá linkeru najít správné funkce a objekty při propojení spustitelného souboru.
Upravené zásady vytváření názvů se změnily v různých verzích sady Visual Studio a můžou se také lišit v různých cílových architekturách. Správné propojení se zdrojovými soubory vytvořenými pomocí sady Visual Studio, knihoven DLL a knihoven C++ by se měly zkompilovat pomocí stejné sady nástrojů kompilátoru, příznaků a cílové architektury.
Poznámka:
Knihovny vytvořené sadou Visual Studio 2015 nebo novější můžou využívat aplikace vytvořené v novějších verzích sady Visual Studio až Visual Studio 2022. Další informace naleznete v tématu Binární kompatibilita jazyka C++ mezi verzemi sady Visual Studio.
Použití zdobených jmen
Za normálních okolností nemusíte znát zdobený název pro napsání kódu, který úspěšně zkompiluje a odkazuje. Dekorované názvy jsou interními podrobnostmi implementace kompilátoru a linkeru. Nástroje obvykle můžou zpracovat název v nekódované podobě. Dekorovaný název se ale někdy vyžaduje, když zadáte název funkce linkeru a dalším nástrojům. Chcete-li například spárovat přetížené funkce jazyka C++, členy oborů názvů, konstruktory tříd, destruktory a speciální členské funkce, je nutné zadat zdobený název. Podrobnosti o příznakech možností a dalších situacích, které vyžadují zdobené názvy, najdete v dokumentaci k nástrojům a možnostem, které používáte.
Pokud změníte název funkce, třídu, konvenci volání, návratový typ nebo jakýkoli parametr, změní se také zdobený název. V tomto případě musíte získat nový zdobený název a použít ho všude, kde je zadaný zdobený název.
Dekorace názvů je také důležitá při propojení s kódem napsaného v jiných programovacích jazycích nebo pomocí jiných kompilátorů. Různé kompilátory používají různé konvence dekorací názvů. Pokud vaše spustitelné odkazy na kód napsaný v jiném jazyce, je potřeba věnovat zvláštní pozornost exportovaným a importovaným názvům a konvencím volání. Kód jazyka sestavení musí používat upravené názvy a konvence volání MSVC k propojení se zdrojovým kódem napsaným pomocí MSVC.
Formát zdobeného názvu jazyka C++
Dekorovaný název funkce jazyka C++ obsahuje následující informace:
Název funkce.
Třída, ve které je funkce členem, pokud se jedná o členskou funkci. Dekorace může zahrnovat třídu, která ohraničuje třídu, která obsahuje funkci atd.
Obor názvů, do něhož funkce patří, pokud je součástí oboru názvů.
Typy parametrů funkce.
Konvence volání.
Návratový typ funkce.
Volitelný prvek specifický pro cíl. V ARM64EC objektech
$$h
se značka vloží do názvu.
Názvy funkcí a tříd jsou kódovány do zdobeného názvu. Zbytek zdobeného názvu je kód, který má interní význam pouze pro kompilátor a linker. Tady jsou příklady nekódovaných a zdobených názvů jazyka C++.
Neschycený název | Zdobené jméno |
---|---|
int a(char){int i=3;return i;}; |
?a@@YAHD@Z |
void __stdcall b::c(float){}; |
?c@b@@AAGXM@Z |
Formát zdobeného názvu jazyka C
Forma dekorace pro funkci jazyka C závisí na konvenci volání použité v deklaraci, jak je znázorněno v následující tabulce. Je to také formát dekorace, který se používá, když je kód C++ deklarován tak, aby měl extern "C"
propojení. Výchozí konvence volání je __cdecl
. V 64bitovém prostředí jsou funkce jazyka C nebo extern "C"
funkce vyzdobeny pouze při použití __vectorcall
konvence volání.
Konvenci | Dekorace |
---|---|
__cdecl |
Úvodní podtržítko (_ ) |
__stdcall |
Úvodní podtržítko (_ ) a koncové znaménko (@ ) následované počtem bajtů v seznamu parametrů v desítkové soustavě |
__fastcall |
Počáteční a koncové znaky (@ ) následované desetinným číslem představujícím počet bajtů v seznamu parametrů |
__vectorcall |
Dva koncové znaky (@@ ) následované desetinným počtem bajtů v seznamu parametrů |
Pro ARM64EC funkce s propojením jazyka C (ať už zkompilovaným jako C nebo pomocí extern "C"
), #
je předzpracovaný název.
Zobrazit zdobené názvy
Po kompilaci zdrojového souboru, který obsahuje data, objektu nebo prototypu nebo prototypu, můžete získat zdobenou formu názvu symbolu. Pokud chcete prozkoumat zdobené názvy v programu, můžete použít jednu z následujících metod:
Použití výpisu k zobrazení zdobených jmen
Vygenerování výpisu kompilováním zdrojového souboru, který obsahuje data, objekt nebo definici funkce nebo prototyp s
/FA
možností kompilátoru (výpis typu souboru) nastaveným na sestavení se zdrojovým kódem (/FAs
).Zadejte například
cl /c /FAs example.cpp
do příkazového řádku pro vývojáře, který vygeneruje souborexample.asm
výpisu .Ve výsledném souboru výpisu vyhledejte řádek, který začíná středníkem
PUBLIC
(;
) a za ním následuje nezakódovaná data nebo název funkce. Symbol meziPUBLIC
středníkem je zdobený název.
Použití DUMPBIN k zobrazení zdobených jmen
Pokud chcete zobrazit exportované symboly v souboru OBJ nebo LIB, zadejte
dumpbin /exports <obj-or-lib-file>
na příkazovém řádku vývojáře.Pokud chcete najít zdobenou formu symbolu, vyhledejte nezakódovaný název v závorkách. Zdobený název je na stejném řádku před nezakódovaným názvem.
Zobrazení nedekódovaných názvů
Pomocí undname.exe můžete převést zdobený název na nedekódovaný formulář. Tento příklad ukazuje, jak funguje:
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)"
Viz také
Další nástroje sestavení MSVC
Určení propojení pomocí extern