Поделиться через


Дополнение имен

Дополнение имен выполняется в соответствии с соглашениями об именовании 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++ между поставщиками компилятора или даже между разными версиями компилятора. Связывание файлов объектов, скомпилированных другими компиляторами, может не создавать ту же схему именования и вызывать неразрешенные внешние элементы.

См. также

Ошибка средств компоновщика LNK2001