Дополнение имен
Обновлен: Ноябрь 2007
Name Decoration
Дополнение имен выполняется в соответствии с соглашениями об именовании C++ и также применяется в ряде случаев в языке C. По умолчанию в C++ для создания имени функции для компоновщика используется имя функции, параметры и тип возвращаемого значения. Рассмотрим следующие функции:
void CALLTYPE test(void)
В следующей таблице представлены имена компоновщика для различных соглашений о вызове.
Соглашение о вызове |
extern "C" или файл с расширением C |
CPP, CXX или /TP |
---|---|---|
Соглашение об именовании C (__cdecl) |
_test |
?test@@ZAXXZ |
Соглашение об именовании fastcall (__fastcall) |
@test@0 |
?test@@YIXXZ |
Соглашение об именовании стандартного вызова (__stdcall) |
_test@0 |
?test@@YGXXZ |
Для вызова функции C из C++ используйте модификатор extern "C". Модификатор extern "C" определяет принудительное использование соглашения об именовании C для функций, не являющихся классами C++. Обратите внимание на использование ключей компилятора /Tc и /TP, которые определяют пропуск расширения файла и компиляцию файла в формате C или C++ соответственно. При использовании этих параметров возможно появление непредвиденных имен.
Эта ошибка также может возникать при использовании прототипов функции с несогласованными параметрами. Дополнение к имени включает параметры функции в окончательное дополненное имя функции. Ошибка LNK2001 также может возникнуть при вызове функции с типами параметров, не соответствующими заданным в объявлении функции.
В настоящее время в C++ не существует общего стандарта именования между поставщиками компиляторов и даже между различными версиями одного компилятора. Таким образом, при связывании объектных файлов, скомпилированных с помощью разных компиляторов, могут быть созданы различные схемы именования, что может привести к ошибкам при разрешении внешних ресурсов.