Sdílet prostřednictvím


Dekorování názvů

Dekorace názvů obvykle odkazuje na konvence pojmenování jazyka C++, ale může platit i pro řadu případů jazyka C. Jazyk C++ ve výchozím nastavení používá název funkce, parametry a návratový typ k vytvoření názvu linkeru pro funkci. Představte si následující deklaraci funkce:

void CALLTYPE test(void);

Následující tabulka uvádí název linkeru pro různé konvence volání.

Konvenci extern "C" nebo .c soubor .cppnebo .cxx/TP
Zásady vytváření názvů jazyka C (__cdecl) _test ?test@@ZAXXZ
Zásady vytváření názvů rychlých volání (__fastcall) @test@0 ?test@@YIXXZ
Standardní konvence pojmenování volání (__stdcall) _test@0 ?test@@YGXXZ
Zásady vytváření názvů vektorových volání (__vectorcall) test@@0 ?test@@YQXXZ

Slouží extern "C" k volání funkce jazyka C z jazyka C++. extern "C" vynutí použití konvence vytváření názvů jazyka C pro jiné funkce než třídy C++. Mějte na paměti přepínače kompilátoru /Tc nebo /Tp, které kompilátoru říkají, aby ignoroval příponu názvu souboru a zkompiloval soubor jako C nebo C++. Tyto možnosti můžou způsobit, že názvy linkerů neočekáváte.

Tato chyba může způsobit také prototypy funkcí, které mají neshodné parametry. Dekorace názvů zahrnuje parametry funkce do konečného zdobeného názvu funkce. Volání funkce s typy parametrů, které neodpovídají těm v deklaraci funkce, může také způsobit LNK2001.

V současné době neexistují žádné standardy pro pojmenování jazyka C++ mezi dodavateli kompilátoru nebo dokonce mezi různými verzemi kompilátoru. Propojení souborů objektů zkompilovaných jinými kompilátory nemusí vytvořit stejné schéma pojmenování a může způsobit nevyřešené externí objekty.

Viz také

Chyba linkerů LNK2001