1

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

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名称修饰呢?这是什么标准?

4

2 回答 2

2

这是Visual C++ 名称修改(我不知道 MSDN 上有描述编码的官方页面;我找不到)。

C++ 函数需要的不仅仅是将它们的名称编码到最终以二进制形式出现的符号中:这些符号需要是唯一的,但 C++ 函数名称不需要是唯一的。除其他原因外,C++ 函数可以重载,您可以在不同的命名空间中拥有同名的函数,并且您必须能够处理成员函数。

编译器使用一种紧凑的编码方案,比如这个,以便可以唯一地识别函数。

于 2011-08-04T14:38:58.207 回答
2

詹姆斯已经说过:这是一个名字修饰问题。放一个

#ifdef __cplusplus
extern "C" {
#endif

之前和一个

#ifdef __cplusplus
}
#endif

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

于 2011-08-04T14:44:40.980 回答