__stdcall名称修饰的语法是什么?

时间:2011-08-04 14:33:14

标签: c calling-convention name-decoration

我有一个程序调用一组函数,如下所示:

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 个答案:

答案 0 :(得分:2)

这是Visual C++ name mangling(我不知道MSDN上有一个官方页面来描述编码;我找不到一个。)

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

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

答案 1 :(得分:2)

詹姆斯已经说过了:这是一个名字错误的问题。放一个

#ifdef __cplusplus
extern "C" {
#endif

之前和之后

#ifdef __cplusplus
}
#endif

函数声明后。这将关闭C ++名称修改。 FWIW,__stdcall与此无关,尽管它是VB,IIRC所必需的。