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

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

См. также

Ссылки

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