【问题标题】:what is the syntax for a __stdcall name decoration?__stdcall 名称修饰的语法是什么?
【发布时间】:2011-08-04 14:33:13
【问题描述】:

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

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

【问题讨论】:

  • 它因编译器而异。你用的是什么编译器?而且该名称不是调用约定标准,它是基本的 C++ 名称修饰,这是编译器将 C++ 方法名称转换为 C 函数名称的方式(在汇编级别没有方法之类的东西)。

标签: c calling-convention name-decoration


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

James 已经说过了:这是一个名称混淆问题。放一个

#ifdef __cplusplus
extern "C" {
#endif

之前和之后

#ifdef __cplusplus
}
#endif

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

【讨论】:

  • IIRC = 如果我没记错的话。
  • 出于某种原因,我认为这是一个协议或类似的东西。 ;-)。谢谢。
  • @Peretz:哈哈!这是常见的 Usenet 俚语,就像 LOL、IMO(最初是 IMHO)、AFAIK、AFAICT、IME、YMMV 等。
  • 哈哈,看来我的usenet 俚语很差。 ;-)
猜你喜欢
  • 2016-12-07
  • 2010-11-21
  • 2017-11-28
  • 1970-01-01
  • 2010-09-22
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多