C - __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名称装饰?这是什么标准?

这是Visual c++名称混淆(我不知道MSDN上是否有官方页面来描述编码;我找不到。

c++函数需要的不仅仅是将其名称编码到二进制文件中的符号中:这些符号必须是唯一的,但c++函数的名称不必是唯一的。除其他原因外,c++函数可以重载,可以在不同的命名空间中使用相同名称的函数,并且必须能够处理成员函数。

编译器使用一个紧凑的编码方案,就像这样,这样函数可以被唯一地标识。

James已经说过了:这是一个名字混淆的问题。把

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif
函数声明后的

。这将关闭c++名称混淆。FWIW, __stdcall与此无关,尽管它是VB, IIRC所需要的。

最新更新