在回调函数上添加 stdcall 会导致参数不匹配 [GNU]
Adding an stdcall on a callback function gives an argument mismatch [GNU]
我正在尝试向我的 GNU 编译 DLL 添加一个 stdcall 调用约定。
这是我的代码:
typedef void (__stdcall * CTMCashAcceptCallback) (
const struct CTMEventInfo,
const struct CTMAcceptEvent );
它被这个函数调用过:
LIBCTMCLIENT_FUNC void ctm_add_cash_accept_event_handler(CTMCashAcceptCallback);
其中:
#define LIBCTMCLIENT_FUNC LIBCTMCLIENT_C_LINKAGE __declspec(dllexport) __stdcall
问题是它给了我这个注释:
注意:预期 'CTMCashAcceptCallback' 但参数类型为 'void (*)(const struct CTMEventInfo, const struct CTMAcceptEvent)'
当我删除 __stdcall 或将其替换为 __cdecl 时,它不会提供该信息。通过 GNU 编译时是否无法使用 stdcall 或者我没有做对?
用户代码需要明确告诉编译器它自己的函数(您没有显示的函数)是 __stdcall
,如果这是 DLL 所期望的。像
__stdcall myCTMCashAccept (
const struct CTMEventInfo,
const struct CTMAcceptEvent)
{
//...
}
// ...
ctm_add_cash_accept_event_handler(myCTMCashAccept);
应该可以。
请记住,您显示的 #define LIBCTMCLIENT_FUNC
是关于用户代码调用 DLL 的约定;而带有 typedef
的回调是另一种方式:它是调用用户代码的 DLL。他们不必使用相同的约定(尽管使用时更清楚);因此,如果您的用户代码可能会使用 __cdecl
代码(可能因为它已经存在),那么您应该从 typedef
中删除 __stdcall
(它也应该可以工作)。
我正在尝试向我的 GNU 编译 DLL 添加一个 stdcall 调用约定。
这是我的代码:
typedef void (__stdcall * CTMCashAcceptCallback) (
const struct CTMEventInfo,
const struct CTMAcceptEvent );
它被这个函数调用过:
LIBCTMCLIENT_FUNC void ctm_add_cash_accept_event_handler(CTMCashAcceptCallback);
其中:
#define LIBCTMCLIENT_FUNC LIBCTMCLIENT_C_LINKAGE __declspec(dllexport) __stdcall
问题是它给了我这个注释:
注意:预期 'CTMCashAcceptCallback' 但参数类型为 'void (*)(const struct CTMEventInfo, const struct CTMAcceptEvent)'
当我删除 __stdcall 或将其替换为 __cdecl 时,它不会提供该信息。通过 GNU 编译时是否无法使用 stdcall 或者我没有做对?
用户代码需要明确告诉编译器它自己的函数(您没有显示的函数)是 __stdcall
,如果这是 DLL 所期望的。像
__stdcall myCTMCashAccept (
const struct CTMEventInfo,
const struct CTMAcceptEvent)
{
//...
}
// ...
ctm_add_cash_accept_event_handler(myCTMCashAccept);
应该可以。
请记住,您显示的 #define LIBCTMCLIENT_FUNC
是关于用户代码调用 DLL 的约定;而带有 typedef
的回调是另一种方式:它是调用用户代码的 DLL。他们不必使用相同的约定(尽管使用时更清楚);因此,如果您的用户代码可能会使用 __cdecl
代码(可能因为它已经存在),那么您应该从 typedef
中删除 __stdcall
(它也应该可以工作)。