Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.