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 |
.cpp nebo .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.