Nazwij dekorację

Dekoracja nazw zwykle odnosi się do konwencji nazewnictwa języka C++, ale może również mieć zastosowanie do wielu przypadków języka C. Domyślnie język C++ używa nazwy funkcji, parametrów i zwracanego typu w celu utworzenia nazwy konsolidatora dla funkcji. Rozważ następującą deklarację funkcji:

void CALLTYPE test(void);

W poniższej tabeli przedstawiono nazwę konsolidatora dla różnych konwencji wywoływania.

Konwencja wywoływania extern "C" lub .c plik .cpplub .cxx/TP
Konwencja nazewnictwa języka C (__cdecl) _test ?test@@ZAXXZ
Konwencja nazewnictwa szybkich wywołań (__fastcall) @test@0 ?test@@YIXXZ
Standardowa konwencja nazewnictwa wywołań (__stdcall) _test@0 ?test@@YGXXZ
Konwencja nazewnictwa wywołań wektorowych (__vectorcall) test@@0 ?test@@YQXXZ

Użyj extern "C" polecenia , aby wywołać funkcję języka C z języka C++. extern "C" wymusza użycie konwencji nazewnictwa języka C dla funkcji nieklasowych języka C++. Należy pamiętać o przełącznikach kompilatora /Tc lub /Tp, które informują kompilator o zignorowaniu rozszerzenia nazwy pliku i skompilowaniu pliku odpowiednio jako C lub C++. Te opcje mogą powodować, że nazwy konsolidatora nie są oczekiwane.

Posiadanie prototypów funkcji, które mają niezgodne parametry, może również spowodować ten błąd. Dekoracja nazw zawiera parametry funkcji w końcowej dekorowanej nazwie funkcji. Wywołanie funkcji z typami parametrów, które nie są zgodne z tymi w deklaracji funkcji, może również spowodować LNK2001.

Obecnie nie ma standardów nazewnictwa języka C++ między dostawcami kompilatora, a nawet między różnymi wersjami kompilatora. Łączenie plików obiektów skompilowanych przez inne kompilatory może nie generować tego samego schematu nazewnictwa i może powodować nierozwiązane zewnętrzne elementy.

Zobacz też

Błąd narzędzi konsolidatora LNK2001