Каков синтаксис для оформления имени __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.

Другие вопросы по тегам