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

  1. 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 soubor example.asmvýpisu .

  2. 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 mezi PUBLIC středníkem je zdobený název.

Použití DUMPBIN k zobrazení zdobených jmen

  1. 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.

  2. 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