каков синтаксис для оформления имени __stdcall? - PullRequest
1 голос
/ 04 августа 2011

У меня есть программа, которая вызывает набор функций следующим образом:

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 ]

2 голосов
/ 04 августа 2011

Джеймс уже сказал это: это проблема искажения имени.Поставьте

#ifdef __cplusplus
extern "C" {
#endif

до и

#ifdef __cplusplus
}
#endif

после объявления функции.Это отключит искажение имени в C ++.FWIW, __stdcall не имеет к этому никакого отношения, хотя это требуется для VB, IIRC.

2 голосов
/ 04 августа 2011

Это Искаженное имя Visual C ++ (я не знаю, что на MSDN есть официальная страница для описания кодировки; я не могу ее найти).

Нужны функции C ++это больше, чем просто их имя, закодированное в символ, который заканчивается в двоичном коде: эти символы должны быть уникальными, но имена функций C ++ не обязательно должны быть уникальными.Помимо прочего, функции C ++ могут быть перегружены, у вас могут быть функции с одинаковыми именами в разных пространствах имен, и вы должны иметь возможность обрабатывать функции-члены.

Компилятор использует компактную схему кодирования, подобную этой, так что функции могут быть однозначно идентифицированы.

...