鉴于以下C ++代码未在函数声明中提及调用约定,导出函数Exported
的调用约定是什么?我的猜测是cdecl的默认值。
extern "C"
{
__declspec (dllexport) bool Exported(int parm);
}
我正在使用LoadLibrary
,GetProcAddress
和Marshal.GetDelegateForFunctionPointer
从托管代码调用此函数。我可以使用UnmanagedFunctionPointer
属性的不同值来装饰我的委托定义,并且所有似乎都能正常工作。
答案 0 :(得分:5)
默认调用约定是cdecl。请注意,__ declspec(dllexport)对调用约定没有影响。
可以在代码中或通过编译器选项指定调用约定。我不建议使用编译器选项,它有点太模糊了。在代码中明确表示,然后读取的任何人都知道使用了什么约定。
请注意,对于64位Windows代码,所有调用约定都是等效的,可以解释您所看到的内容。
答案 1 :(得分:2)
默认调用会话还取决于某些编译器开关:
在c / c ++下 - >高级你可以设置它:
/ Gd = cdecl,/ Gz = stdcall,/ Gr = fastcall