导出函数的默认调用约定是什么(VS2008)

本文关键字:是什么 VS2008 约定 调用 函数 默认 | 更新日期: 2023-09-27 18:13:55

给定下面的c++代码,在函数声明中没有提到调用约定,那么导出函数Exported的调用约定是什么?我猜是默认的cdecl。

extern "C"
{
  __declspec (dllexport) bool Exported(int parm);
}

我从托管代码调用此函数,使用LoadLibrary, GetProcAddressMarshal.GetDelegateForFunctionPointer。我可以用不同的UnmanagedFunctionPointer属性值装饰我的委托定义,它们都似乎工作。

导出函数的默认调用约定是什么(VS2008)

默认调用约定为cdecl。注意__declspec(dllexport)对调用约定没有影响。

调用约定可以在代码中指定,也可以通过编译器选项指定。我不建议使用编译器选项,它有点太模糊了。让它在代码中显式,然后任何阅读它的人都知道使用什么约定。

请注意,对于64位Windows代码,所有调用约定都是等效的,这可以解释您所看到的

默认调用约定还取决于一些编译器开关:

在c/c++ -> advanced下可以设置:

/Gd = cdecl,/Gz = stdcall,/Gr = fastcall