Дополнение имен
Дополнение имен выполняется в соответствии с соглашениями об именовании C++ и также применяется в ряде случаев в языке C. По умолчанию в C++ для создания имени компоновщика для функции используются имя функции, параметры и тип возвращаемого значения. Рассмотрим следующее объявление функции:
void CALLTYPE test(void);
В таблице ниже представлены имена компоновщика для различных соглашений о вызовах.
Соглашение о вызовах | extern "C" или .c файл |
.cpp , .cxx или /TP |
---|---|---|
Соглашение об именовании C (__cdecl ) |
_test |
?test@@ZAXXZ |
Соглашение об именовании быстрых вызовов (__fastcall ) |
@test@0 |
?test@@YIXXZ |
Стандартное соглашение об именовании вызовов (__stdcall ) |
_test@0 |
?test@@YGXXZ |
Соглашение об именовании векторных вызовов (__vectorcall ) |
test@@0 |
?test@@YQXXZ |
Используется extern "C"
для вызова функции C из C++. extern "C"
принудительно использует соглашение об именовании C для функций C++, отличных от класса. Помните о параметрах компилятора /Tc или /Tp, которые сообщают компилятору игнорировать расширение имени файла и компилировать файл как C или C++соответственно. Эти параметры могут привести к тому, что имена компоновщика не ожидаются.
Эта ошибка также может возникать при использовании прототипов функции с несогласованными параметрами. Дополнение к имени включает параметры функции в окончательное дополненное имя функции. Вызов функции с типами параметров, которые не соответствуют тем, которые в объявлении функции также могут вызвать LNK2001.
В настоящее время нет стандартов именования C++ между поставщиками компилятора или даже между разными версиями компилятора. Связывание файлов объектов, скомпилированных другими компиляторами, может не создавать ту же схему именования и вызывать неразрешенные внешние элементы.