在回调函数上添加 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(它也应该可以工作)。