Каков синтаксис для оформления имени __stdcall?
У меня есть программа, которая вызывает набор функций следующим образом:
int _stdcall VB_Create(char*);
int _stdcall VB_Open(unsigned int, unsigned int, unsigned int, unsigned int);
...
...
Если в оформлении имени есть несоответствие, компоновщик показывает ошибку, подобную этой:
error LNK2019: unresolved external symbol "int __stdcall VB_Create(char *)" (?VB_Create@@YGHPAD@Z) .....
Я понимаю, что _stdcall
Синтаксис является '_' + 'name of the function' + '@' + 'number of arguments * 4'
,
Итак, почему компоновщик просит ?VB_Create@@YGHPAD@Z
название украшения? какой стандарт это?
2 ответа
Это искажение имен в Visual C++ (я не знаю, что на MSDN есть официальная страница для описания кодировки; я не смог ее найти).
Функции C++ нуждаются не только в их имени, закодированном в символ, который заканчивается в двоичном коде: эти символы должны быть уникальными, но имена функций C++ не обязательно должны быть уникальными. Помимо прочего, функции C++ могут быть перегружены, у вас могут быть функции с одинаковыми именами в разных пространствах имен, и вы должны иметь возможность обрабатывать функции-члены.
Компилятор использует компактную схему кодирования, такую как эта, так что функции могут быть однозначно идентифицированы.
Джеймс уже сказал это: это вопрос искажения имени. Положить
#ifdef __cplusplus
extern "C" {
#endif
до и
#ifdef __cplusplus
}
#endif
после объявления функций. Это отключит искажение имени в C++. FWIW, __stdcall
не имеет к этому никакого отношения, хотя это требуется для VB, IIRC.