导出函数(VS2008)的默认调用约定是什么?
假设以下 C++ 代码在函数声明中没有提及调用约定,那么导出函数 Exported
的调用约定是什么?我的猜测是 cdecl 的默认值。
extern "C"
{
__declspec (dllexport) bool Exported(int parm);
}
我使用 LoadLibrary
、GetProcAddress
和 Marshal.GetDelegateForFunctionPointer
从托管代码调用此函数。我可以使用 UnmanagedFunctionPointer
属性的不同值来装饰我的委托定义,并且它们都似乎都可以工作。
Given the following C++ code which doesn't mention a calling convention in the function declaration, what will the calling convention be for the exported function Exported
? My guess would be a default of cdecl.
extern "C"
{
__declspec (dllexport) bool Exported(int parm);
}
I'm calling this function from managed code, using LoadLibrary
, GetProcAddress
, and Marshal.GetDelegateForFunctionPointer
. I can decorate my delegate definition with different values of the UnmanagedFunctionPointer
attribute and they all seem to work.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
默认调用约定是 cdecl。请注意,__declspec(dllexport) 对调用约定没有影响。
调用约定可以在代码中指定,也可以通过编译器选项指定。我不建议使用编译器选项,它有点太晦涩了。在代码中明确说明,然后任何阅读 if 的人都知道使用什么约定。
请注意,对于 64 位 Windows 代码,所有调用约定都是等效的,这可以解释您所看到的内容。
The default calling convention is cdecl. Note that __declspec(dllexport) has no influence on calling convention.
The calling convention can be specified in code, or by a compiler option. I don't recommend using the compiler option, it's a bit too obscure. Make it explicit in code and then anyone reading if knows what convention is used.
Note that for 64 bit Windows code, all calling conventions are equivalent which could explain what you see.
默认的调用约定还取决于一些编译器开关:
在 c/c++ 下 ->高级你可以设置它:
/Gd = cdecl, /Gz = stdcall, /Gr = fastcall
The default calling convetion also depends on some compiler switches:
Under c/c++ -> advanced you can set it:
/Gd = cdecl, /Gz = stdcall, /Gr = fastcall